mirror of
https://github.com/grafana/grafana.git
synced 2025-09-18 07:02:52 +08:00

* add new option for multi variables to lock value list wip * WIP - lock option list * tests * fix * fixes + canary scenes * wip * wip * fix snapshot * bump scenes * Dashboards: Add possibility to lock adhoc variables options list (#96077) * Lock list of options flag for ad hoc * refactor * fix snapshot
143 lines
5.1 KiB
TypeScript
143 lines
5.1 KiB
TypeScript
import { FormEvent } from 'react';
|
|
import { useAsync } from 'react-use';
|
|
|
|
import { DataSourceInstanceSettings, SelectableValue, TimeRange } from '@grafana/data';
|
|
import { selectors } from '@grafana/e2e-selectors';
|
|
import { getDataSourceSrv } from '@grafana/runtime';
|
|
import { QueryVariable } from '@grafana/scenes';
|
|
import { DataSourceRef, VariableRefresh, VariableSort } from '@grafana/schema';
|
|
import { Field } from '@grafana/ui';
|
|
import { QueryEditor } from 'app/features/dashboard-scene/settings/variables/components/QueryEditor';
|
|
import { SelectionOptionsForm } from 'app/features/dashboard-scene/settings/variables/components/SelectionOptionsForm';
|
|
import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker';
|
|
import { getVariableQueryEditor } from 'app/features/variables/editor/getVariableQueryEditor';
|
|
import { QueryVariableRefreshSelect } from 'app/features/variables/query/QueryVariableRefreshSelect';
|
|
import { QueryVariableSortSelect } from 'app/features/variables/query/QueryVariableSortSelect';
|
|
|
|
import { VariableLegend } from './VariableLegend';
|
|
import { VariableTextAreaField } from './VariableTextAreaField';
|
|
|
|
type VariableQueryType = QueryVariable['state']['query'];
|
|
|
|
interface QueryVariableEditorFormProps {
|
|
datasource?: DataSourceRef;
|
|
onDataSourceChange: (dsSettings: DataSourceInstanceSettings) => void;
|
|
query: VariableQueryType;
|
|
onQueryChange: (query: VariableQueryType) => void;
|
|
onLegacyQueryChange: (query: VariableQueryType, definition: string) => void;
|
|
timeRange: TimeRange;
|
|
regex: string | null;
|
|
onRegExChange: (event: FormEvent<HTMLTextAreaElement>) => void;
|
|
sort: VariableSort;
|
|
onSortChange: (option: SelectableValue<VariableSort>) => void;
|
|
refresh: VariableRefresh;
|
|
onRefreshChange: (option: VariableRefresh) => void;
|
|
isMulti: boolean;
|
|
onMultiChange: (event: FormEvent<HTMLInputElement>) => void;
|
|
allowCustomValue?: boolean;
|
|
onAllowCustomValueChange?: (event: FormEvent<HTMLInputElement>) => void;
|
|
includeAll: boolean;
|
|
onIncludeAllChange: (event: FormEvent<HTMLInputElement>) => void;
|
|
allValue: string;
|
|
onAllValueChange: (event: FormEvent<HTMLInputElement>) => void;
|
|
}
|
|
|
|
export function QueryVariableEditorForm({
|
|
datasource: datasourceRef,
|
|
onDataSourceChange,
|
|
query,
|
|
onQueryChange,
|
|
onLegacyQueryChange,
|
|
timeRange,
|
|
regex,
|
|
onRegExChange,
|
|
sort,
|
|
onSortChange,
|
|
refresh,
|
|
onRefreshChange,
|
|
isMulti,
|
|
onMultiChange,
|
|
allowCustomValue,
|
|
onAllowCustomValueChange,
|
|
includeAll,
|
|
onIncludeAllChange,
|
|
allValue,
|
|
onAllValueChange,
|
|
}: QueryVariableEditorFormProps) {
|
|
const { value: dsConfig } = useAsync(async () => {
|
|
const datasource = await getDataSourceSrv().get(datasourceRef ?? '');
|
|
const VariableQueryEditor = await getVariableQueryEditor(datasource);
|
|
|
|
return { datasource, VariableQueryEditor };
|
|
}, [datasourceRef]);
|
|
const { datasource, VariableQueryEditor } = dsConfig ?? {};
|
|
|
|
return (
|
|
<>
|
|
<VariableLegend>Query options</VariableLegend>
|
|
<Field label="Data source" htmlFor="data-source-picker">
|
|
<DataSourcePicker current={datasourceRef} onChange={onDataSourceChange} variables={true} width={30} />
|
|
</Field>
|
|
|
|
{datasource && VariableQueryEditor && (
|
|
<QueryEditor
|
|
onQueryChange={onQueryChange}
|
|
onLegacyQueryChange={onLegacyQueryChange}
|
|
datasource={datasource}
|
|
query={query}
|
|
VariableQueryEditor={VariableQueryEditor}
|
|
timeRange={timeRange}
|
|
/>
|
|
)}
|
|
|
|
<VariableTextAreaField
|
|
defaultValue={regex ?? ''}
|
|
name="Regex"
|
|
description={
|
|
<div>
|
|
Optional, if you want to extract part of a series name or metric node segment.
|
|
<br />
|
|
Named capture groups can be used to separate the display text and value (
|
|
<a
|
|
className="external-link"
|
|
href="https://grafana.com/docs/grafana/latest/variables/filter-variables-with-regex#filter-and-modify-using-named-text-and-value-capture-groups"
|
|
target="__blank"
|
|
>
|
|
see examples
|
|
</a>
|
|
).
|
|
</div>
|
|
}
|
|
placeholder="/.*-(?<text>.*)-(?<value>.*)-.*/"
|
|
onBlur={onRegExChange}
|
|
testId={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRegExInputV2}
|
|
width={52}
|
|
/>
|
|
|
|
<QueryVariableSortSelect
|
|
testId={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsSortSelectV2}
|
|
onChange={onSortChange}
|
|
sort={sort}
|
|
/>
|
|
|
|
<QueryVariableRefreshSelect
|
|
testId={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRefreshSelectV2}
|
|
onChange={onRefreshChange}
|
|
refresh={refresh}
|
|
/>
|
|
|
|
<VariableLegend>Selection options</VariableLegend>
|
|
<SelectionOptionsForm
|
|
multi={!!isMulti}
|
|
includeAll={!!includeAll}
|
|
allowCustomValue={allowCustomValue}
|
|
allValue={allValue}
|
|
onMultiChange={onMultiChange}
|
|
onIncludeAllChange={onIncludeAllChange}
|
|
onAllValueChange={onAllValueChange}
|
|
onAllowCustomValueChange={onAllowCustomValueChange}
|
|
/>
|
|
</>
|
|
);
|
|
}
|