import React, { Suspense } from 'react'; import { PopoverController, Popover, ClickOutsideWrapper } from '@grafana/ui'; import { FunctionDescriptor, FunctionEditorControls, FunctionEditorControlsProps } from './FunctionEditorControls'; interface FunctionEditorProps extends FunctionEditorControlsProps { func: FunctionDescriptor; } interface FunctionEditorState { showingDescription: boolean; } const FunctionDescription = React.lazy(async () => { // @ts-ignore const { default: rst2html } = await import(/* webpackChunkName: "rst2html" */ 'rst2html'); return { default: (props: { description?: string }) => (
), }; }); class FunctionEditor extends React.PureComponent { private triggerRef = React.createRef(); constructor(props: FunctionEditorProps) { super(props); this.state = { showingDescription: false, }; } renderContent = ({ updatePopperPosition }: any) => { const { onMoveLeft, onMoveRight, func: { def: { name, description }, }, } = this.props; const { showingDescription } = this.state; if (showingDescription) { return (

{name}

Loading description...}>
); } return ( { onMoveLeft(this.props.func); updatePopperPosition(); }} onMoveRight={() => { onMoveRight(this.props.func); updatePopperPosition(); }} onDescriptionShow={() => { this.setState({ showingDescription: true }, () => { updatePopperPosition(); }); }} /> ); }; render() { return ( {(showPopper, hidePopper, popperProps) => { return ( <> {this.triggerRef.current && ( { this.setState({ showingDescription: false }); }} renderArrow={({ arrowProps, placement }) => (
)} /> )} { if (popperProps.show) { hidePopper(); } }} > { this.setState({ showingDescription: false }); }} style={{ cursor: 'pointer' }} > {this.props.func.def.name} ); }} ); } } export { FunctionEditor };