Commit 2e21613b by Torkel Ödegaard

fix(templating): fixed issues with dynamic dashboard srv (panel/row) repeats, fixes #6237

parent 4df379f9
......@@ -51,7 +51,9 @@ export class DashboardCtrl {
.catch($scope.onInitFailed.bind(this, 'Templating init failed', false))
// continue
.finally(function() {
dynamicDashboardSrv.init(dashboard);
dynamicDashboardSrv.init(dashboard, variableSrv);
dynamicDashboardSrv.process();
unsavedChangesSrv.init(dashboard, $scope);
$scope.dashboard = dashboard;
......@@ -87,7 +89,7 @@ export class DashboardCtrl {
};
$scope.templateVariableUpdated = function() {
dynamicDashboardSrv.update($scope.dashboard);
dynamicDashboardSrv.process();
};
$scope.updateSubmenuVisibility = function() {
......
......@@ -9,23 +9,21 @@ import coreModule from 'app/core/core_module';
export class DynamicDashboardSrv {
iteration: number;
dashboard: any;
variables: any;
init(dashboard) {
if (dashboard.snapshot) { return; }
this.process(dashboard, {});
}
update(dashboard) {
if (dashboard.snapshot) { return; }
this.process(dashboard, {});
init(dashboard, variableSrv) {
this.dashboard = dashboard;
this.variables = variableSrv.variables;
}
process(dashboard, options) {
if (dashboard.templating.list.length === 0) { return; }
process(options) {
if (this.dashboard.snapshot || this.variables.length === 0) {
return;
}
this.dashboard = dashboard;
this.iteration = (this.iteration || new Date().getTime()) + 1;
options = options || {};
var cleanUpOnly = options.cleanUpOnly;
var i, j, row, panel;
......@@ -105,8 +103,7 @@ export class DynamicDashboardSrv {
// returns a new row clone or reuses a clone from previous iteration
repeatRow(row, rowIndex) {
var variables = this.dashboard.templating.list;
var variable = _.find(variables, {name: row.repeat});
var variable = _.find(this.variables, {name: row.repeat});
if (!variable) {
return;
}
......@@ -166,8 +163,7 @@ export class DynamicDashboardSrv {
}
repeatPanel(panel, row) {
var variables = this.dashboard.templating.list;
var variable = _.find(variables, {name: panel.repeat});
var variable = _.find(this.variables, {name: panel.repeat});
if (!variable) { return; }
var selected;
......
......@@ -13,7 +13,8 @@ export class DashboardExporter {
makeExportable(dash) {
var dynSrv = new DynamicDashboardSrv();
dynSrv.process(dash, {cleanUpOnly: true});
dynSrv.init(dash, {variables: dash.templating.list});
dynSrv.process({cleanUpOnly: true});
dash.id = null;
......
......@@ -20,6 +20,8 @@ function dynamicDashScenario(desc, func) {
beforeEach(angularMocks.inject(function(dashboardSrv) {
ctx.dashboardSrv = dashboardSrv;
ctx.variableSrv = {};
var model = {
rows: [],
templating: { list: [] }
......@@ -27,8 +29,10 @@ function dynamicDashScenario(desc, func) {
setupFunc(model);
ctx.dash = ctx.dashboardSrv.create(model);
ctx.variableSrv.variables = ctx.dash.templating.list;
ctx.dynamicDashboardSrv = new DynamicDashboardSrv();
ctx.dynamicDashboardSrv.init(ctx.dash);
ctx.dynamicDashboardSrv.init(ctx.dash, ctx.variableSrv);
ctx.dynamicDashboardSrv.process();
ctx.rows = ctx.dash.rows;
}));
};
......@@ -78,7 +82,7 @@ dynamicDashScenario('given dashboard with panel repeat', function(ctx) {
beforeEach(function() {
repeatedPanelAfterIteration1 = ctx.rows[0].panels[1];
ctx.rows[0].panels[0].fill = 10;
ctx.dynamicDashboardSrv.update(ctx.dash);
ctx.dynamicDashboardSrv.process();
});
it('should have reused same panel instances', function() {
......@@ -102,7 +106,7 @@ dynamicDashScenario('given dashboard with panel repeat', function(ctx) {
options: [{text: 'se1', value: 'se1', selected: true}]
});
ctx.rows[0].panels[0].repeat = "server";
ctx.dynamicDashboardSrv.update(ctx.dash);
ctx.dynamicDashboardSrv.process();
});
it('should remove scopedVars value for last variable', function() {
......@@ -117,7 +121,7 @@ dynamicDashScenario('given dashboard with panel repeat', function(ctx) {
describe('After a second iteration and selected values reduced', function() {
beforeEach(function() {
ctx.dash.templating.list[0].options[1].selected = false;
ctx.dynamicDashboardSrv.update(ctx.dash);
ctx.dynamicDashboardSrv.process();
});
it('should clean up repeated panel', function() {
......@@ -128,7 +132,7 @@ dynamicDashScenario('given dashboard with panel repeat', function(ctx) {
describe('After a second iteration and panel repeat is turned off', function() {
beforeEach(function() {
ctx.rows[0].panels[0].repeat = null;
ctx.dynamicDashboardSrv.update(ctx.dash);
ctx.dynamicDashboardSrv.process();
});
it('should clean up repeated panel', function() {
......@@ -199,7 +203,7 @@ dynamicDashScenario('given dashboard with row repeat', function(ctx) {
beforeEach(function() {
repeatedRowAfterFirstIteration = ctx.rows[1];
ctx.rows[0].height = 500;
ctx.dynamicDashboardSrv.update(ctx.dash);
ctx.dynamicDashboardSrv.process();
});
it('should still only have 2 rows', function() {
......@@ -218,7 +222,7 @@ dynamicDashScenario('given dashboard with row repeat', function(ctx) {
describe('After a second iteration and selected values reduced', function() {
beforeEach(function() {
ctx.dash.templating.list[0].options[1].selected = false;
ctx.dynamicDashboardSrv.update(ctx.dash);
ctx.dynamicDashboardSrv.process();
});
it('should remove repeated second row', function() {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment