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 * Migrate function editor to react * Simplify setting Segment Select min width * Remove unnecessary changes to SegmentInput * Extract view logic to a helper and update types definitions * Clean up types * Update FuncDef types and add tests * Show red border for unknown functions * Autofocus on new params * Extract params mapping to a helper * Split code between params and function editor * Focus on the first param when a function is added even if it's an optional argument * Add function editor tests * Remove todo marker * Fix adding new functions * Allow empty value in selects for removing function params * Add placeholders and fix styling * Add more docs * Create basic implementation for metrics and tags * Post merge fixes These files are not .ts * Remove mapping to Angular dropdowns * Simplify mapping tag names, values and operators * Simplify mapping metrics * Fix removing tags and autocomplete * Simplify debouncing providers * Ensure options are loaded twice and segment is opened * Remove focusing new segments logic (not supported by React's segment) * Clean up * Move debouncing to components * Simplify mapping to selectable options * Add docs * Group all components * Remove unused controller methods * Create Dispatch context * Group Series and Tags Sections * Create Functions section * Create Section component * use getStyles * remove redundant async/await * Remove * remove redundant async/await * Remove console.log and silent test console output * Do not display the name of the selected dropdown option * Move Section to grafana-ui * Update storybook * Simplify SectionLabel * Fix Influx tests * Fix API Extractor warnings * Fix API Extractor warnings * Do not show hidden functions * Use block docs for better doc generation * Handle undefined values provided for autocomplete * Section -> SegmentSection * Simplify section styling * Remove redundant div * Simplify SegmentSection component * Use theme.spacing * Use empty label instead of a single space label Co-authored-by: Giordano Ricci <me@giordanoricci.com>
98 lines
3.4 KiB
TypeScript
98 lines
3.4 KiB
TypeScript
import React, { useState } from 'react';
|
|
import { HorizontalGroup, InlineLabel, useStyles2 } from '@grafana/ui';
|
|
import { GrafanaTheme2 } from '@grafana/data';
|
|
import { css, cx } from '@emotion/css';
|
|
import { FuncInstance } from '../gfunc';
|
|
import { EditableParam, FunctionParamEditor } from './FunctionParamEditor';
|
|
import { actions } from '../state/actions';
|
|
import { FunctionEditor } from './FunctionEditor';
|
|
import { mapFuncInstanceToParams } from './helpers';
|
|
import { useDispatch } from '../state/context';
|
|
|
|
export type FunctionEditorProps = {
|
|
func: FuncInstance;
|
|
};
|
|
|
|
/**
|
|
* Allows editing function params and removing/moving a function (note: editing function name is not supported)
|
|
*/
|
|
export function GraphiteFunctionEditor({ func }: FunctionEditorProps) {
|
|
const dispatch = useDispatch();
|
|
const styles = useStyles2(getStyles);
|
|
|
|
// keep track of mouse over and isExpanded state to display buttons for adding optional/multiple params
|
|
// only when the user mouse over over the function editor OR any param editor is expanded.
|
|
const [mouseOver, setIsMouseOver] = useState(false);
|
|
const [expanded, setIsExpanded] = useState(false);
|
|
|
|
let params = mapFuncInstanceToParams(func);
|
|
params = params.filter((p: EditableParam, index: number) => {
|
|
// func.added is set for newly added functions - see autofocus below
|
|
return (index < func.def.params.length && !p.optional) || func.added || p.value || expanded || mouseOver;
|
|
});
|
|
|
|
return (
|
|
<div
|
|
className={cx(styles.container, { [styles.error]: func.def.unknown })}
|
|
onMouseOver={() => setIsMouseOver(true)}
|
|
onMouseLeave={() => setIsMouseOver(false)}
|
|
>
|
|
<HorizontalGroup spacing="none">
|
|
<FunctionEditor
|
|
func={func}
|
|
onMoveLeft={() => {
|
|
dispatch(actions.moveFunction({ func, offset: -1 }));
|
|
}}
|
|
onMoveRight={() => {
|
|
dispatch(actions.moveFunction({ func, offset: 1 }));
|
|
}}
|
|
onRemove={() => {
|
|
dispatch(actions.removeFunction({ func }));
|
|
}}
|
|
/>
|
|
<InlineLabel className={styles.label}>(</InlineLabel>
|
|
{params.map((editableParam: EditableParam, index: number) => {
|
|
return (
|
|
<React.Fragment key={index}>
|
|
<FunctionParamEditor
|
|
autofocus={index === 0 && func.added}
|
|
editableParam={editableParam}
|
|
onChange={(value) => {
|
|
if (value !== '' || editableParam.optional) {
|
|
dispatch(actions.updateFunctionParam({ func, index, value }));
|
|
}
|
|
setIsExpanded(false);
|
|
setIsMouseOver(false);
|
|
}}
|
|
onExpandedChange={setIsExpanded}
|
|
/>
|
|
{index !== params.length - 1 ? ',' : ''}
|
|
</React.Fragment>
|
|
);
|
|
})}
|
|
<InlineLabel className={styles.label}>)</InlineLabel>
|
|
</HorizontalGroup>
|
|
</div>
|
|
);
|
|
}
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => ({
|
|
container: css({
|
|
backgroundColor: theme.colors.background.secondary,
|
|
borderRadius: theme.shape.borderRadius(),
|
|
marginRight: theme.spacing(0.5),
|
|
padding: `0 ${theme.spacing(1)}`,
|
|
height: `${theme.v1.spacing.formInputHeight}px`,
|
|
}),
|
|
error: css`
|
|
border: 1px solid ${theme.colors.error.main};
|
|
`,
|
|
label: css({
|
|
padding: 0,
|
|
margin: 0,
|
|
}),
|
|
button: css({
|
|
padding: theme.spacing(0.5),
|
|
}),
|
|
});
|