mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
* 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>
87 lines
2.4 KiB
TypeScript
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;
|
|
})}
|
|
</>
|
|
);
|
|
};
|