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>
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 { useDispatch } from '../state/context';
|
|
|
|
type Props = {
|
|
funcDefs: FuncDefs;
|
|
};
|
|
|
|
export function AddGraphiteFunction({ funcDefs }: Props) {
|
|
const dispatch = useDispatch();
|
|
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}
|
|
/>
|
|
);
|
|
}
|
|
|
|
function getStyles(theme: GrafanaTheme2) {
|
|
return {
|
|
button: css`
|
|
margin-right: ${theme.spacing(0.5)};
|
|
`,
|
|
};
|
|
}
|