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 * Rename .tsx -> .ts * Update types * Use ?? instead of || + add test for mapping options * Use const (let is not needed here) * Revert test name change * Allow removing only optional params and mark additional params as optional (only the first one is required) * Use theme.typography.bodySmall.fontSize Co-authored-by: Giordano Ricci <me@giordanoricci.com>
51 lines
1.7 KiB
TypeScript
51 lines
1.7 KiB
TypeScript
import React, { useEffect, useMemo, useState } from 'react';
|
|
import { Button, Segment, useStyles2 } from '@grafana/ui';
|
|
import { FuncDefs } from '../gfunc';
|
|
import { actions } from '../state/actions';
|
|
import { GrafanaTheme2, SelectableValue } from '@grafana/data';
|
|
import { css, cx } from '@emotion/css';
|
|
import { mapFuncDefsToSelectables } from './helpers';
|
|
import { Dispatch } from 'redux';
|
|
|
|
type Props = {
|
|
dispatch: Dispatch;
|
|
funcDefs: FuncDefs;
|
|
};
|
|
|
|
export function AddGraphiteFunction({ dispatch, funcDefs }: Props) {
|
|
const [value, setValue] = useState<SelectableValue<string> | undefined>(undefined);
|
|
const styles = useStyles2(getStyles);
|
|
|
|
const options = useMemo(() => mapFuncDefsToSelectables(funcDefs), [funcDefs]);
|
|
|
|
// Note: actions.addFunction will add a component that will have a dropdown or input in auto-focus
|
|
// (the first param of the function). This auto-focus will cause onBlur() on AddGraphiteFunction's
|
|
// Segment component and trigger onChange once again. (why? we call onChange if the user dismissed
|
|
// the dropdown, see: SegmentSelect.onCloseMenu for more details). To avoid it we need to wait for
|
|
// the Segment to disappear first (hence useEffect) and then dispatch the action that will add new
|
|
// components.
|
|
useEffect(() => {
|
|
if (value?.value !== undefined) {
|
|
dispatch(actions.addFunction({ name: value.value }));
|
|
setValue(undefined);
|
|
}
|
|
}, [value, dispatch]);
|
|
|
|
return (
|
|
<Segment
|
|
Component={<Button icon="plus" variant="secondary" className={cx(styles.button)} />}
|
|
options={options}
|
|
onChange={setValue}
|
|
inputMinWidth={150}
|
|
></Segment>
|
|
);
|
|
}
|
|
|
|
function getStyles(theme: GrafanaTheme2) {
|
|
return {
|
|
button: css`
|
|
margin-right: ${theme.spacing(0.5)};
|
|
`,
|
|
};
|
|
}
|