diff --git a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx index 828e36b16a5..3445488f3e3 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx @@ -1,12 +1,15 @@ import { css, cx } from '@emotion/css'; -import React, { FC, FormEvent, ReactNode, useCallback, useEffect, useState } from 'react'; +import { useDialog } from '@react-aria/dialog'; +import { FocusScope } from '@react-aria/focus'; +import { useOverlay } from '@react-aria/overlays'; +import React, { FC, FormEvent, ReactNode, useCallback, useEffect, useRef, useState } from 'react'; import Calendar from 'react-calendar'; import { usePopper } from 'react-popper'; import { useMedia } from 'react-use'; import { dateTimeFormat, DateTime, dateTime, GrafanaTheme2, isDateTime } from '@grafana/data'; -import { Button, ClickOutsideWrapper, HorizontalGroup, Icon, InlineField, Input, Portal } from '../..'; +import { Button, HorizontalGroup, Icon, InlineField, Input, Portal } from '../..'; import { useStyles2, useTheme2 } from '../../../themes'; import { getModalStyles } from '../../Modal/getModalStyles'; import { TimeOfDayPicker } from '../TimeOfDayPicker'; @@ -24,11 +27,16 @@ export interface Props { maxDate?: Date; } -const stopPropagation = (event: React.MouseEvent) => event.stopPropagation(); - export const DateTimePicker: FC = ({ date, maxDate, label, onChange }) => { const [isOpen, setOpen] = useState(false); + const ref = useRef(null); + const { overlayProps, underlayProps } = useOverlay( + { onClose: () => setOpen(false), isDismissable: true, isOpen }, + ref + ); + const { dialogProps } = useDialog({}, ref); + const theme = useTheme2(); const { modalBackdrop } = getModalStyles(theme); const isFullscreen = useMedia(`(min-width: ${theme.breakpoints.values.lg}px)`); @@ -70,26 +78,35 @@ export const DateTimePicker: FC = ({ date, maxDate, label, onChange }) => {isOpen ? ( isFullscreen ? ( - setOpen(false)}> - setOpen(false)} - maxDate={maxDate} - ref={setSelectorElement} - style={popper.styles.popper} - /> - + +
+ setOpen(false)} + maxDate={maxDate} + ref={setSelectorElement} + style={popper.styles.popper} + /> +
+
) : ( - setOpen(false)}> -
- setOpen(false)} /> +
+ +
+
+ setOpen(false)} + /> +
-
- + ) ) : null} @@ -142,16 +159,6 @@ const DateTimeInput = React.forwardRef( }); }, []); - const onFocus = useCallback( - (event: FormEvent) => { - if (!isFullscreen) { - return; - } - onOpen(event); - }, - [isFullscreen, onOpen] - ); - const onBlur = useCallback(() => { if (isDateTime(internalDate.value)) { onChange(dateTime(internalDate.value)); @@ -162,18 +169,15 @@ const DateTimeInput = React.forwardRef( return ( }, []); return ( -
+
({ `, modal: css` position: fixed; - top: 25%; - left: 25%; - width: 100%; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); z-index: ${theme.zIndex.modal}; max-width: 280px; `, diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerCalendar.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerCalendar.tsx index 6711766d100..89049e12b26 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerCalendar.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerCalendar.tsx @@ -65,8 +65,6 @@ export interface TimePickerCalendarProps { isReversed?: boolean; } -const stopPropagation = (event: React.MouseEvent) => event.stopPropagation(); - function TimePickerCalendar(props: TimePickerCalendarProps) { const theme = useTheme2(); const { modalBackdrop } = getModalStyles(theme); @@ -95,7 +93,7 @@ function TimePickerCalendar(props: TimePickerCalendarProps) { if (isFullscreen) { return ( -
+
@@ -105,9 +103,9 @@ function TimePickerCalendar(props: TimePickerCalendarProps) { return ( -
+
-
+
diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneGroup.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneGroup.tsx index 62479b92623..b8925c66fc9 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneGroup.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneGroup.tsx @@ -10,18 +10,16 @@ interface Props { children?: React.ReactNode; } -const stopPropagation = (event: React.MouseEvent) => event.stopPropagation(); - export const TimeZoneGroup = (props: Props) => { const { children, label } = props; const styles = useStyles2(getStyles); if (!label) { - return
{children}
; + return
{children}
; } return ( -
+
{label}