mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* Add UMLs * Add rendered diagrams * Move QueryCtrl to flux * Remove redundant param in the reducer * Use named imports for lodash and fix typing for GraphiteTagOperator * Add missing async/await * Extract providers to a separate file * Clean up async await * Rename controller functions back to main * Simplify creating actions * Re-order controller functions * Separate helpers from actions * Rename vars * Simplify helpers * Move controller methods to state reducers * Remove docs (they are added in design doc) * Move actions.ts to state folder * Add docs * Add old methods stubs for easier review * Check how state dependencies will be mapped * Rename state to store * Rename state to store * Rewrite spec tests for Graphite Query Controller * Update docs * Update docs * Add GraphiteTextEditor * Add play button * Add AddGraphiteFunction * Use Segment to simplify AddGraphiteFunction * Memoize function defs * Fix useCallback deps * Update public/app/plugins/datasource/graphite/state/helpers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Update public/app/plugins/datasource/graphite/state/helpers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Update public/app/plugins/datasource/graphite/state/helpers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Update public/app/plugins/datasource/graphite/state/providers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Update public/app/plugins/datasource/graphite/state/providers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Update public/app/plugins/datasource/graphite/state/providers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Update public/app/plugins/datasource/graphite/state/providers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Update public/app/plugins/datasource/graphite/state/providers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Update public/app/plugins/datasource/graphite/state/providers.ts Co-authored-by: Giordano Ricci <me@giordanoricci.com> * Add more type definitions * Remove submitOnClickAwayOption This behavior is actually needed to remove parameters in functions * Load function definitions before parsing the target on initial load * Add button padding * Fix loading function definitions * Change targetChanged to updateQuery to avoid mutating state directly It's also needed for extra refresh/runQuery execution as handleTargetChanged doesn't handle changing the raw query * Fix updating query after adding a function * Simplify updating function params * Simplify setting Segment Select min width * Extract view logic to a helper and update types definitions * Clean up types * Update FuncDef types and add tests Co-authored-by: Giordano Ricci <me@giordanoricci.com>
95 lines
3.0 KiB
TypeScript
95 lines
3.0 KiB
TypeScript
import React, { useRef } from 'react';
|
||
import { PopoverController, Popover, ClickOutsideWrapper, Icon, Tooltip, useTheme } from '@grafana/ui';
|
||
import { FunctionEditorControls, FunctionEditorControlsProps } from './FunctionEditorControls';
|
||
import { FuncInstance } from './gfunc';
|
||
import { css } from '@emotion/css';
|
||
|
||
interface FunctionEditorProps extends FunctionEditorControlsProps {
|
||
func: FuncInstance;
|
||
}
|
||
|
||
const FunctionEditor: React.FC<FunctionEditorProps> = ({ onMoveLeft, onMoveRight, func, ...props }) => {
|
||
const triggerRef = useRef<HTMLSpanElement>(null);
|
||
const theme = useTheme();
|
||
|
||
const renderContent = ({ updatePopperPosition }: any) => (
|
||
<FunctionEditorControls
|
||
{...props}
|
||
func={func}
|
||
onMoveLeft={() => {
|
||
onMoveLeft(func);
|
||
updatePopperPosition();
|
||
}}
|
||
onMoveRight={() => {
|
||
onMoveRight(func);
|
||
updatePopperPosition();
|
||
}}
|
||
/>
|
||
);
|
||
|
||
return (
|
||
<PopoverController content={renderContent} placement="top" hideAfter={100}>
|
||
{(showPopper, hidePopper, popperProps) => {
|
||
return (
|
||
<>
|
||
{triggerRef.current && (
|
||
<Popover
|
||
{...popperProps}
|
||
referenceElement={triggerRef.current}
|
||
wrapperClassName="popper"
|
||
className="popper__background"
|
||
renderArrow={({ arrowProps, placement }) => (
|
||
<div className="popper__arrow" data-placement={placement} {...arrowProps} />
|
||
)}
|
||
/>
|
||
)}
|
||
<ClickOutsideWrapper
|
||
onClick={() => {
|
||
if (popperProps.show) {
|
||
hidePopper();
|
||
}
|
||
}}
|
||
>
|
||
<span ref={triggerRef} onClick={popperProps.show ? hidePopper : showPopper} style={{ cursor: 'pointer' }}>
|
||
{func.def.unknown && (
|
||
<Tooltip content={<TooltipContent />} placement="bottom">
|
||
<Icon
|
||
data-testid="warning-icon"
|
||
name="exclamation-triangle"
|
||
size="xs"
|
||
className={css`
|
||
margin-right: ${theme.spacing.xxs};
|
||
`}
|
||
/>
|
||
</Tooltip>
|
||
)}
|
||
{func.def.name}
|
||
</span>
|
||
</ClickOutsideWrapper>
|
||
</>
|
||
);
|
||
}}
|
||
</PopoverController>
|
||
);
|
||
};
|
||
|
||
const TooltipContent = React.memo(() => {
|
||
return (
|
||
<span>
|
||
This function is not supported. Check your function for typos and{' '}
|
||
<a
|
||
target="_blank"
|
||
className="external-link"
|
||
rel="noreferrer noopener"
|
||
href="https://graphite.readthedocs.io/en/latest/functions.html"
|
||
>
|
||
read the docs
|
||
</a>{' '}
|
||
to see whether you need to upgrade your data source’s version to make this function available.
|
||
</span>
|
||
);
|
||
});
|
||
TooltipContent.displayName = 'FunctionEditorTooltipContent';
|
||
|
||
export { FunctionEditor };
|