mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
DatasourceVariables: Update query editor when switching datasources from picker (#62617)
This commit is contained in:
@@ -77,6 +77,7 @@ export class QueryEditorRow<TQuery extends DataQuery> extends PureComponent<Prop
|
|||||||
element: HTMLElement | null = null;
|
element: HTMLElement | null = null;
|
||||||
angularScope: AngularQueryComponentScope<TQuery> | null = null;
|
angularScope: AngularQueryComponentScope<TQuery> | null = null;
|
||||||
angularQueryEditor: AngularComponent | null = null;
|
angularQueryEditor: AngularComponent | null = null;
|
||||||
|
dataSourceSrv = getDataSourceSrv();
|
||||||
id = '';
|
id = '';
|
||||||
|
|
||||||
state: State<TQuery> = {
|
state: State<TQuery> = {
|
||||||
@@ -136,25 +137,33 @@ export class QueryEditorRow<TQuery extends DataQuery> extends PureComponent<Prop
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
getQueryDataSourceIdentifier(): string | null | undefined {
|
/**
|
||||||
const { query, dataSource: dsSettings } = this.props;
|
* When datasource variables are used the query.datasource.uid property is a string variable expression
|
||||||
return query.datasource?.uid ?? dsSettings.uid;
|
* DataSourceSettings.uid can also be this variable expression.
|
||||||
|
* This function always returns the current interpolated datasource uid.
|
||||||
|
*/
|
||||||
|
getInterpolatedDataSourceUID(): string | undefined {
|
||||||
|
if (this.props.query.datasource) {
|
||||||
|
const instanceSettings = this.dataSourceSrv.getInstanceSettings(this.props.query.datasource);
|
||||||
|
return instanceSettings?.rawRef?.uid ?? instanceSettings?.uid;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.props.dataSource.rawRef?.uid ?? this.props.dataSource.uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
async loadDatasource() {
|
async loadDatasource() {
|
||||||
const dataSourceSrv = getDataSourceSrv();
|
|
||||||
let datasource: DataSourceApi;
|
let datasource: DataSourceApi;
|
||||||
const dataSourceIdentifier = this.getQueryDataSourceIdentifier();
|
const interpolatedUID = this.getInterpolatedDataSourceUID();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
datasource = await dataSourceSrv.get(dataSourceIdentifier);
|
datasource = await this.dataSourceSrv.get(interpolatedUID);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
datasource = await dataSourceSrv.get();
|
datasource = await this.dataSourceSrv.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.setState({
|
this.setState({
|
||||||
datasource: datasource as unknown as DataSourceApi<TQuery>,
|
datasource: datasource as unknown as DataSourceApi<TQuery>,
|
||||||
loadedDataSourceIdentifier: dataSourceIdentifier,
|
loadedDataSourceIdentifier: interpolatedUID,
|
||||||
hasTextEditMode: has(datasource, 'components.QueryCtrl.prototype.toggleEditorMode'),
|
hasTextEditMode: has(datasource, 'components.QueryCtrl.prototype.toggleEditorMode'),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -182,7 +191,7 @@ export class QueryEditorRow<TQuery extends DataQuery> extends PureComponent<Prop
|
|||||||
}
|
}
|
||||||
|
|
||||||
// check if we need to load another datasource
|
// check if we need to load another datasource
|
||||||
if (datasource && loadedDataSourceIdentifier !== this.getQueryDataSourceIdentifier()) {
|
if (datasource && loadedDataSourceIdentifier !== this.getInterpolatedDataSourceUID()) {
|
||||||
if (this.angularQueryEditor) {
|
if (this.angularQueryEditor) {
|
||||||
this.angularQueryEditor.destroy();
|
this.angularQueryEditor.destroy();
|
||||||
this.angularQueryEditor = null;
|
this.angularQueryEditor = null;
|
||||||
@@ -243,7 +252,7 @@ export class QueryEditorRow<TQuery extends DataQuery> extends PureComponent<Prop
|
|||||||
isWaitingForDatasourceToLoad(): boolean {
|
isWaitingForDatasourceToLoad(): boolean {
|
||||||
// if we not yet have loaded the datasource in state the
|
// if we not yet have loaded the datasource in state the
|
||||||
// ds in props and the ds in state will have different values.
|
// ds in props and the ds in state will have different values.
|
||||||
return this.props.dataSource.uid !== this.state.loadedDataSourceIdentifier;
|
return this.getInterpolatedDataSourceUID() !== this.state.loadedDataSourceIdentifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
renderPluginEditor = () => {
|
renderPluginEditor = () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user