grafana/public/app/features/dashboard/components/PanelEditor/PanelOptionsEditor.tsx
Ryan McKinley bbd24cd93a
Monaco: add suggestions for template variables (#25921)
* now with suggestions

* using suggestions API

* using variable suggestions

* using variable suggestions

* show variables

* minor cleanup

* add @alpha warning

* Do not produce data variables if panel does not support queries

Co-authored-by: Dominik Prokop <dominik.prokop@grafana.com>
2020-07-01 09:36:34 +02:00

87 lines
2.4 KiB
TypeScript

import React, { useMemo } from 'react';
import {
DataFrame,
InterpolateFunction,
PanelOptionsEditorItem,
PanelPlugin,
StandardEditorContext,
VariableSuggestionsScope,
} from '@grafana/data';
import { get as lodashGet, set as lodashSet } from 'lodash';
import { Field, Label } from '@grafana/ui';
import groupBy from 'lodash/groupBy';
import { OptionsGroup } from './OptionsGroup';
import { getPanelOptionsVariableSuggestions } from 'app/features/panel/panellinks/link_srv';
interface PanelOptionsEditorProps<TOptions> {
plugin: PanelPlugin;
data?: DataFrame[];
replaceVariables: InterpolateFunction;
options: TOptions;
onChange: (options: TOptions) => void;
}
export const PanelOptionsEditor: React.FC<PanelOptionsEditorProps<any>> = ({
plugin,
options,
onChange,
data,
replaceVariables,
}) => {
const optionEditors = useMemo<Record<string, PanelOptionsEditorItem[]>>(() => {
return groupBy(plugin.optionEditors.list(), i => {
return i.category ? i.category[0] : 'Display';
});
}, [plugin]);
const onOptionChange = (key: string, value: any) => {
const newOptions = lodashSet({ ...options }, key, value);
onChange(newOptions);
};
const context: StandardEditorContext<any> = {
data: data || [],
replaceVariables,
options,
getSuggestions: (scope?: VariableSuggestionsScope) => {
return getPanelOptionsVariableSuggestions(plugin, data);
},
};
return (
<>
{Object.keys(optionEditors).map((c, i) => {
const optionsToShow = optionEditors[c]
.map((e, j) => {
if (e.showIf && !e.showIf(options)) {
return null;
}
const label = (
<Label description={e.description} category={e.category?.slice(1)}>
{e.name}
</Label>
);
return (
<Field label={label} key={`${e.id}/${j}`}>
<e.editor
value={lodashGet(options, e.path)}
onChange={value => onOptionChange(e.path, value)}
item={e}
context={context}
/>
</Field>
);
})
.filter(e => e !== null);
return optionsToShow.length > 0 ? (
<OptionsGroup title={c} defaultToClosed id={`${c}/${i}`} key={`${c}/${i}`}>
<div>{optionsToShow}</div>
</OptionsGroup>
) : null;
})}
</>
);
};