Prometheus: Query builder operation docs popover improvements (#46006)

This commit is contained in:
Torkel Ödegaard 2022-03-01 13:12:14 +01:00 committed by GitHub
parent 16b99cc0f5
commit 9bd6290968
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -3,8 +3,7 @@ import { GrafanaTheme2, renderMarkdown } from '@grafana/data';
import { FlexItem } from '@grafana/experimental';
import { Button, Portal, useStyles2 } from '@grafana/ui';
import React, { useState } from 'react';
import { usePopper } from 'react-popper';
import { useToggle } from 'react-use';
import { usePopperTooltip } from 'react-popper-tooltip';
import { QueryBuilderOperation, QueryBuilderOperationDef } from './types';
export interface Props {
@ -14,41 +13,39 @@ export interface Props {
export const OperationInfoButton = React.memo<Props>(({ def, operation }) => {
const styles = useStyles2(getStyles);
const [popperTrigger, setPopperTrigger] = useState<HTMLButtonElement | null>(null);
const [popover, setPopover] = useState<HTMLDivElement | null>(null);
const [isOpen, toggleIsOpen] = useToggle(false);
const popper = usePopper(popperTrigger, popover, {
const [show, setShow] = useState(false);
const { getTooltipProps, setTooltipRef, setTriggerRef, visible } = usePopperTooltip({
placement: 'top',
modifiers: [
{ name: 'arrow', enabled: true },
{
name: 'preventOverflow',
enabled: true,
options: {
rootBoundary: 'viewport',
},
},
],
visible: show,
offset: [0, 16],
onVisibleChange: setShow,
interactive: true,
trigger: ['click'],
});
return (
<>
<Button
ref={setPopperTrigger}
title="Click to show description"
ref={setTriggerRef}
icon="info-circle"
size="sm"
variant="secondary"
fill="text"
onClick={toggleIsOpen}
/>
{isOpen && (
{visible && (
<Portal>
<div ref={setPopover} style={popper.styles.popper} {...popper.attributes.popper} className={styles.docBox}>
<div ref={setTooltipRef} {...getTooltipProps()} className={styles.docBox}>
<div className={styles.docBoxHeader}>
<span>{def.renderer(operation, def, '<expr>')}</span>
<FlexItem grow={1} />
<Button icon="times" onClick={toggleIsOpen} fill="text" variant="secondary" title="Remove operation" />
<Button
icon="times"
onClick={() => setShow(false)}
fill="text"
variant="secondary"
title="Remove operation"
/>
</div>
<div
className={styles.docBoxBody}
@ -67,9 +64,9 @@ const getStyles = (theme: GrafanaTheme2) => {
return {
docBox: css({
overflow: 'hidden',
background: theme.colors.background.canvas,
background: theme.colors.background.primary,
border: `1px solid ${theme.colors.border.strong}`,
boxShadow: theme.shadows.z2,
boxShadow: theme.shadows.z3,
maxWidth: '600px',
padding: theme.spacing(1),
borderRadius: theme.shape.borderRadius(),