1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import React, { Suspense } from 'react';
- import { Icon, Tooltip } from '@grafana/ui';
- import { FuncInstance } from '../gfunc';
- export interface FunctionEditorControlsProps {
- onMoveLeft: (func: FuncInstance) => void;
- onMoveRight: (func: FuncInstance) => void;
- onRemove: (func: FuncInstance) => void;
- }
- const FunctionDescription = React.lazy(async () => {
- // @ts-ignore
- const { default: rst2html } = await import(/* webpackChunkName: "rst2html" */ 'rst2html');
- return {
- default(props: { description?: string }) {
- return <div dangerouslySetInnerHTML={{ __html: rst2html(props.description ?? '') }} />;
- },
- };
- });
- const FunctionHelpButton = (props: { description?: string; name: string }) => {
- if (props.description) {
- let tooltip = (
- <Suspense fallback={<span>Loading description...</span>}>
- <FunctionDescription description={props.description} />
- </Suspense>
- );
- return (
- <Tooltip content={tooltip} placement={'bottom-end'}>
- <Icon className={props.description ? undefined : 'pointer'} name="question-circle" />
- </Tooltip>
- );
- }
- return (
- <Icon
- className="pointer"
- name="question-circle"
- onClick={() => {
- window.open(
- 'http://graphite.readthedocs.org/en/latest/functions.html#graphite.render.functions.' + props.name,
- '_blank'
- );
- }}
- />
- );
- };
- export const FunctionEditorControls = (
- props: FunctionEditorControlsProps & {
- func: FuncInstance;
- }
- ) => {
- const { func, onMoveLeft, onMoveRight, onRemove } = props;
- return (
- <div
- style={{
- display: 'flex',
- width: '60px',
- justifyContent: 'space-between',
- }}
- >
- <Icon name="arrow-left" onClick={() => onMoveLeft(func)} />
- <FunctionHelpButton name={func.def.name} description={func.def.description} />
- <Icon name="times" onClick={() => onRemove(func)} />
- <Icon name="arrow-right" onClick={() => onMoveRight(func)} />
- </div>
- );
- };
|