diff --git a/packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx index 77c08d13510..b28d14cc5b2 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx @@ -1,5 +1,6 @@ import { css, cx } from '@emotion/css'; import React, { FormEvent, useCallback, useState } from 'react'; +import { usePopper } from 'react-popper'; import { RelativeTimeRange, GrafanaTheme2, TimeOption } from '@grafana/data'; @@ -11,6 +12,7 @@ import CustomScrollbar from '../../CustomScrollbar/CustomScrollbar'; import { Field } from '../../Forms/Field'; import { Icon } from '../../Icon/Icon'; import { getInputStyles, Input } from '../../Input/Input'; +import { Portal } from '../../Portal/Portal'; import { Tooltip } from '../../Tooltip/Tooltip'; import { TimePickerTitle } from '../TimeRangePicker/TimePickerTitle'; import { TimeRangeList } from '../TimeRangePicker/TimeRangeList'; @@ -50,6 +52,12 @@ export function RelativeTimeRangePicker(props: RelativeTimeRangePickerProps) { const [from, setFrom] = useState({ value: timeOption.from, validation: isRangeValid(timeOption.from) }); const [to, setTo] = useState({ value: timeOption.to, validation: isRangeValid(timeOption.to) }); + const [markerElement, setMarkerElement] = useState(null); + const [selectorElement, setSelectorElement] = useState(null); + const popper = usePopper(markerElement, selectorElement, { + placement: 'auto-start', + }); + const styles = useStyles2(getStyles(from.validation.errorMessage, to.validation.errorMessage)); const onChangeTimeOption = (option: TimeOption) => { @@ -94,7 +102,7 @@ export function RelativeTimeRangePicker(props: RelativeTimeRangePickerProps) { }; return ( -
+
{isOpen && ( - -
-
- - - -
-
- - } placement="bottom" theme="info"> -
- - Specify time range - -
-
-
-
- - event.stopPropagation()} - onBlur={() => setFrom({ ...from, validation: isRangeValid(from.value) })} - onChange={(event) => setFrom({ ...from, value: event.currentTarget.value })} - value={from.value} + + +
+
+ + - - - event.stopPropagation()} - onBlur={() => setTo({ ...to, validation: isRangeValid(to.value) })} - onChange={(event) => setTo({ ...to, value: event.currentTarget.value })} - value={to.value} - /> - - + +
+
+ + } placement="bottom" theme="info"> +
+ + Specify time range + +
+
+
+
+ + event.stopPropagation()} + onBlur={() => setFrom({ ...from, validation: isRangeValid(from.value) })} + onChange={(event) => setFrom({ ...from, value: event.currentTarget.value })} + value={from.value} + /> + + + event.stopPropagation()} + onBlur={() => setTo({ ...to, validation: isRangeValid(to.value) })} + onChange={(event) => setTo({ ...to, value: event.currentTarget.value })} + value={to.value} + /> + + +
-
- + + )}
);