grafana/public/app/features/templating/variable_srv.ts

108 lines
2.3 KiB
TypeScript
Raw Normal View History

///<reference path="../../headers/common.d.ts" />
import angular from 'angular';
import _ from 'lodash';
import $ from 'jquery';
import coreModule from 'app/core/core_module';
import appEvents from 'app/core/app_events';
interface Variable {
}
class ConstantVariable implements Variable {
constructor(private model) {
}
}
class CustomVariable implements Variable {
constructor(private model) {
}
}
class IntervalVariable implements Variable {
constructor(private model) {
}
}
class QueryVariable implements Variable {
constructor(private model,
private variableSrv: VariableSrv,
private datasourceSrv) {
_.extend(this, model);
}
updateOptions() {
return this.datasourceSrv.get(this.datasource)
.then(_.partial(this.updateOptionsFromMetricFindQuery, variable))
.then(_.partial(this.updateTags, variable))
.then(_.partial(this.validateVariableSelectionState, variable));
}
}
class DatasourceVariable implements Variable {
constructor(private model) {
}
}
export class VariableSrv {
dashboard: any;
variables: any;
variableLock: any;
/** @ngInject */
constructor(
private $q,
private $rootScope,
private datasourceSrv,
private $location,
private templateSrv,
private timeSrv) {
}
init(dashboard) {
this.variableLock = {};
this.dashboard = dashboard;
this.variables = dashboard.templating.list.map(item => {
return new QueryVariable(item, this);
});
this.templateSrv.init(this.variables);
return this.$q.when();
}
updateOptions(variable) {
return variable.updateOptions();
}
variableUpdated(variable) {
// if there is a variable lock ignore cascading update because we are in a boot up scenario
if (this.variableLock[variable.name]) {
return this.$q.when();
}
var promises = _.map(this.variables, otherVariable => {
if (otherVariable === variable) {
return;
}
if (this.templateSrv.containsVariable(otherVariable.regex, variable.name) ||
this.templateSrv.containsVariable(otherVariable.query, variable.name) ||
this.templateSrv.containsVariable(otherVariable.datasource, variable.name)) {
return this.updateOptions(otherVariable);
}
});
return this.$q.all(promises);
}
}
coreModule.service('variableSrv', VariableSrv);