dynamicDashboardSrv.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. define([
  2. 'angular',
  3. 'lodash',
  4. ],
  5. function (angular, _) {
  6. 'use strict';
  7. var module = angular.module('grafana.services');
  8. module.service('dynamicDashboardSrv', function() {
  9. var self = this;
  10. this.init = function(dashboard) {
  11. this.dashboard = dashboard;
  12. this.iteration = new Date().getTime();
  13. this.handlePanelRepeats(dashboard);
  14. this.handleRowRepeats(dashboard);
  15. };
  16. this.update = function(dashboard) {
  17. this.dashboard = dashboard;
  18. this.iteration = this.iteration + 1;
  19. this.handlePanelRepeats(dashboard);
  20. this.handleRowRepeats(dashboard);
  21. };
  22. this.handlePanelRepeats = function(dashboard) {
  23. var i, j, row, panel;
  24. for (i = 0; i < dashboard.rows.length; i++) {
  25. row = dashboard.rows[i];
  26. for (j = 0; j < row.panels.length; j++) {
  27. panel = row.panels[j];
  28. if (panel.repeat) {
  29. this.repeatPanel(panel, row, dashboard);
  30. }
  31. // clean up old left overs
  32. else if (panel.repeatPanelId && panel.repeatIteration !== this.iteration) {
  33. row.panels = _.without(row.panels, panel);
  34. j = j - 1;
  35. }
  36. }
  37. }
  38. };
  39. this.handleRowRepeats = function(dashboard) {
  40. var i, row;
  41. for (i = 0; i < dashboard.rows.length; i++) {
  42. row = dashboard.rows[i];
  43. if (row.repeat) {
  44. this.repeatRow(row, dashboard);
  45. }
  46. // clean up old left overs
  47. else if (row.repeatRowId && row.repeatIteration !== this.iteration) {
  48. dashboard.rows.splice(i, 1);
  49. i = i - 1;
  50. }
  51. }
  52. };
  53. this.getRowClone = function(sourceRow, index) {
  54. if (index === 0) {
  55. return sourceRow;
  56. }
  57. var i, panel, row, copy;
  58. var sourceRowId = _.indexOf(this.dashboard.rows, sourceRow) + 1;
  59. // look for row to reuse
  60. for (i = 0; i < this.dashboard.rows.length; i++) {
  61. row = this.dashboard.rows[i];
  62. if (row.repeatRowId === sourceRowId && row.repeatIteration !== this.iteration) {
  63. copy = row;
  64. break;
  65. }
  66. }
  67. if (!copy) {
  68. copy = angular.copy(sourceRow);
  69. this.dashboard.rows.push(copy);
  70. // set new panel ids
  71. for (i = 0; i < copy.panels.length; i++) {
  72. panel = copy.panels[i];
  73. panel.id = this.dashboard.getNextPanelId();
  74. }
  75. }
  76. copy.repeat = null;
  77. copy.repeatRowId = sourceRowId;
  78. copy.repeatIteration = this.iteration;
  79. return copy;
  80. };
  81. this.repeatRow = function(row, dashboard) {
  82. var variables = dashboard.templating.list;
  83. var variable = _.findWhere(variables, {name: row.repeat.replace('$', '')});
  84. if (!variable) {
  85. return;
  86. }
  87. var selected, copy, i, panel;
  88. if (variable.current.text === 'All') {
  89. selected = variable.options.slice(1, variable.options.length);
  90. } else {
  91. selected = _.filter(variable.options, {selected: true});
  92. }
  93. _.each(selected, function(option, index) {
  94. copy = self.getRowClone(row, index);
  95. for (i = 0; i < copy.panels.length; i++) {
  96. panel = copy.panels[i];
  97. panel.scopedVars = panel.scopedVars || {};
  98. panel.scopedVars[variable.name] = option;
  99. }
  100. });
  101. };
  102. this.getPanelClone = function(sourcePanel, row, index) {
  103. // if first clone return source
  104. if (index === 0) {
  105. return sourcePanel;
  106. }
  107. var i, tmpId, panel, clone;
  108. // first try finding an existing clone to use
  109. for (i = 0; i < row.panels.length; i++) {
  110. panel = row.panels[i];
  111. if (panel.repeatIteration !== this.iteration && panel.repeatPanelId === sourcePanel.id) {
  112. clone = panel;
  113. break;
  114. }
  115. }
  116. if (!clone) {
  117. clone = { id: this.dashboard.getNextPanelId() };
  118. row.panels.push(clone);
  119. }
  120. // save id
  121. tmpId = clone.id;
  122. // copy properties from source
  123. angular.extend(clone, sourcePanel);
  124. // restore id
  125. clone.id = tmpId;
  126. clone.repeatIteration = this.iteration;
  127. clone.repeatPanelId = sourcePanel.id;
  128. clone.repeat = null;
  129. return clone;
  130. };
  131. this.repeatPanel = function(panel, row, dashboard) {
  132. var variables = dashboard.templating.list;
  133. var variable = _.findWhere(variables, {name: panel.repeat.replace('$', '')});
  134. if (!variable) {
  135. return;
  136. }
  137. var selected;
  138. if (variable.current.text === 'All') {
  139. selected = variable.options.slice(1, variable.options.length);
  140. } else {
  141. selected = _.filter(variable.options, {selected: true});
  142. }
  143. _.each(selected, function(option, index) {
  144. var copy = self.getPanelClone(panel, row, index);
  145. copy.scopedVars = {};
  146. copy.scopedVars[variable.name] = option;
  147. });
  148. };
  149. });
  150. });