dashboardNavCtrl.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. define([
  2. 'angular',
  3. 'lodash',
  4. 'vendor/filesaver'
  5. ],
  6. function (angular, _) {
  7. 'use strict';
  8. var module = angular.module('grafana.controllers');
  9. module.controller('DashboardNavCtrl', function($scope, $rootScope, alertSrv, $location, playlistSrv, backendSrv, $timeout) {
  10. $scope.init = function() {
  11. $scope.onAppEvent('save-dashboard', $scope.saveDashboard);
  12. $scope.onAppEvent('delete-dashboard', $scope.deleteDashboard);
  13. };
  14. $scope.openEditView = function(editview) {
  15. var search = _.extend($location.search(), {editview: editview});
  16. $location.search(search);
  17. };
  18. $scope.showSettingsMenu = function() {
  19. return $scope.dashboardMeta.canEdit || $scope.contextSrv.isEditor;
  20. };
  21. $scope.starDashboard = function() {
  22. if ($scope.dashboardMeta.isStarred) {
  23. backendSrv.delete('/api/user/stars/dashboard/' + $scope.dashboard.id).then(function() {
  24. $scope.dashboardMeta.isStarred = false;
  25. });
  26. }
  27. else {
  28. backendSrv.post('/api/user/stars/dashboard/' + $scope.dashboard.id).then(function() {
  29. $scope.dashboardMeta.isStarred = true;
  30. });
  31. }
  32. };
  33. $scope.shareDashboard = function() {
  34. $scope.appEvent('show-modal', {
  35. src: './app/features/dashboard/partials/shareModal.html',
  36. scope: $scope.$new(),
  37. });
  38. };
  39. $scope.openSearch = function() {
  40. $scope.appEvent('show-dash-search');
  41. };
  42. $scope.hideTooltip = function(evt) {
  43. angular.element(evt.currentTarget).tooltip('hide');
  44. $scope.appEvent('hide-dash-search');
  45. };
  46. $scope.makeEditable = function() {
  47. $scope.dashboard.editable = true;
  48. var clone = $scope.dashboard.getSaveModelClone();
  49. backendSrv.saveDashboard(clone, {overwrite: false}).then(function(data) {
  50. $scope.dashboard.version = data.version;
  51. $scope.appEvent('dashboard-saved', $scope.dashboard);
  52. $scope.appEvent('alert-success', ['Dashboard saved', 'Saved as ' + clone.title]);
  53. //force refresh whole page
  54. window.location.href = window.location.href;
  55. }, $scope.handleSaveDashError);
  56. };
  57. $scope.saveDashboard = function(options) {
  58. if ($scope.dashboardMeta.canSave === false) {
  59. return;
  60. }
  61. var clone = $scope.dashboard.getSaveModelClone();
  62. backendSrv.saveDashboard(clone, options).then(function(data) {
  63. $scope.dashboard.version = data.version;
  64. $scope.appEvent('dashboard-saved', $scope.dashboard);
  65. var dashboardUrl = '/dashboard/db/' + data.slug;
  66. if (dashboardUrl !== $location.path()) {
  67. $location.url(dashboardUrl);
  68. }
  69. $scope.appEvent('alert-success', ['Dashboard saved', 'Saved as ' + clone.title]);
  70. }, $scope.handleSaveDashError);
  71. };
  72. $scope.handleSaveDashError = function(err) {
  73. if (err.data && err.data.status === "version-mismatch") {
  74. err.isHandled = true;
  75. $scope.appEvent('confirm-modal', {
  76. title: 'Someone else has updated this dashboard!',
  77. text: "Would you still like to save this dashboard?",
  78. yesText: "Save & Overwrite",
  79. icon: "fa-warning",
  80. onConfirm: function() {
  81. $scope.saveDashboard({overwrite: true});
  82. }
  83. });
  84. }
  85. if (err.data && err.data.status === "name-exists") {
  86. err.isHandled = true;
  87. $scope.appEvent('confirm-modal', {
  88. title: 'Another dashboard with the same name exists',
  89. text: "Would you still like to save this dashboard?",
  90. yesText: "Save & Overwrite",
  91. icon: "fa-warning",
  92. onConfirm: function() {
  93. $scope.saveDashboard({overwrite: true});
  94. }
  95. });
  96. }
  97. };
  98. $scope.deleteDashboard = function() {
  99. $scope.appEvent('confirm-modal', {
  100. title: 'Do you want to delete dashboard ' + $scope.dashboard.title + '?',
  101. icon: 'fa-trash',
  102. yesText: 'Delete',
  103. onConfirm: function() {
  104. $scope.deleteDashboardConfirmed();
  105. }
  106. });
  107. };
  108. $scope.deleteDashboardConfirmed = function() {
  109. backendSrv.delete('/api/dashboards/db/' + $scope.dashboardMeta.slug).then(function() {
  110. $scope.appEvent('alert-success', ['Dashboard Deleted', $scope.dashboard.title + ' has been deleted']);
  111. $location.url('/');
  112. });
  113. };
  114. $scope.saveDashboardAs = function() {
  115. var newScope = $rootScope.$new();
  116. newScope.clone = $scope.dashboard.getSaveModelClone();
  117. newScope.clone.editable = true;
  118. newScope.clone.hideControls = false;
  119. $scope.appEvent('show-modal', {
  120. src: './app/features/dashboard/partials/saveDashboardAs.html',
  121. scope: newScope,
  122. });
  123. };
  124. $scope.exportDashboard = function() {
  125. var clone = $scope.dashboard.getSaveModelClone();
  126. var blob = new Blob([angular.toJson(clone, true)], { type: "application/json;charset=utf-8" });
  127. window.saveAs(blob, $scope.dashboard.title + '-' + new Date().getTime());
  128. };
  129. $scope.snapshot = function() {
  130. $scope.dashboard.snapshot = true;
  131. $rootScope.$broadcast('refresh');
  132. $timeout(function() {
  133. $scope.exportDashboard();
  134. $scope.dashboard.snapshot = false;
  135. $scope.appEvent('dashboard-snapshot-cleanup');
  136. }, 1000);
  137. };
  138. $scope.editJson = function() {
  139. var clone = $scope.dashboard.getSaveModelClone();
  140. $scope.appEvent('show-json-editor', { object: clone });
  141. };
  142. $scope.stopPlaylist = function() {
  143. playlistSrv.stop(1);
  144. };
  145. });
  146. });