From 4705589f1b256b8ebfeb8b05ea682f46547fc736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolt=C3=A1n=20Bedi?= Date: Thu, 13 May 2021 15:36:28 +0200 Subject: [PATCH] Exemplars: refactor exemplar marker (#34053) Don't use tooltip container. Revert pointer-events: none for tooltip container. --- packages/grafana-ui/src/themes/mixins.ts | 1 + .../timeseries/plugins/ExemplarMarker.tsx | 55 ++++++++++--------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/packages/grafana-ui/src/themes/mixins.ts b/packages/grafana-ui/src/themes/mixins.ts index 737dcf4bf8a..1c23bd1afef 100644 --- a/packages/grafana-ui/src/themes/mixins.ts +++ b/packages/grafana-ui/src/themes/mixins.ts @@ -64,6 +64,7 @@ export function getFocusStyles(theme: GrafanaTheme2): CSSObject { // max-width is set up based on .grafana-tooltip class that's used in dashboard export const getTooltipContainerStyles = (theme: GrafanaTheme2) => ` + pointer-events: none; overflow: hidden; background: ${theme.colors.background.secondary}; box-shadow: ${theme.shadows.z2}; diff --git a/public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx b/public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx index b92f7239102..56543fe4c96 100644 --- a/public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx +++ b/public/app/plugins/panel/timeseries/plugins/ExemplarMarker.tsx @@ -10,8 +10,9 @@ import { TimeZone, } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { FieldLinkList, Portal, useStyles, VizTooltipContainer } from '@grafana/ui'; +import { FieldLinkList, Portal, useStyles } from '@grafana/ui'; import React, { useCallback, useRef, useState } from 'react'; +import { usePopper } from 'react-popper'; interface ExemplarMarkerProps { timeZone: TimeZone; @@ -23,20 +24,11 @@ interface ExemplarMarkerProps { export const ExemplarMarker: React.FC = ({ timeZone, dataFrame, index, getFieldLinks }) => { const styles = useStyles(getExemplarMarkerStyles); const [isOpen, setIsOpen] = useState(false); - const markerRef = useRef(null); - const annotationPopoverRef = useRef(null); + const [markerElement, setMarkerElement] = React.useState(null); + const [popperElement, setPopperElement] = React.useState(null); + const { styles: popperStyles, attributes } = usePopper(markerElement, popperElement); const popoverRenderTimeout = useRef(); - const timeFormatter = useCallback( - (value: number) => { - return dateTimeFormat(value, { - format: systemDateFormats.fullDate, - timeZone, - }); - }, - [timeZone] - ); - const onMouseEnter = useCallback(() => { if (popoverRenderTimeout.current) { clearTimeout(popoverRenderTimeout.current); @@ -51,22 +43,23 @@ export const ExemplarMarker: React.FC = ({ timeZone, dataFr }, [setIsOpen]); const renderMarker = useCallback(() => { - if (!markerRef?.current) { - return null; - } - - const el = markerRef.current; - const elBBox = el.getBoundingClientRect(); + const timeFormatter = (value: number) => { + return dateTimeFormat(value, { + format: systemDateFormats.fullDate, + timeZone, + }); + }; return ( - -
+
Exemplar
@@ -94,14 +87,24 @@ export const ExemplarMarker: React.FC = ({ timeZone, dataFr
-
+ ); - }, [dataFrame.fields, getFieldLinks, index, onMouseEnter, onMouseLeave, styles, timeFormatter]); + }, [ + attributes.popper, + dataFrame.fields, + getFieldLinks, + index, + onMouseEnter, + onMouseLeave, + popperStyles.popper, + styles, + timeZone, + ]); return ( <>