dashboardLoaderSrv.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. define([
  2. 'angular',
  3. 'moment',
  4. 'lodash',
  5. 'jquery',
  6. 'app/core/utils/kbn',
  7. 'app/core/utils/datemath',
  8. 'app/core/services/impression_srv'
  9. ],
  10. function (angular, moment, _, $, kbn, dateMath, impressionSrv) {
  11. 'use strict';
  12. kbn = kbn.default;
  13. impressionSrv = impressionSrv.default;
  14. var module = angular.module('grafana.services');
  15. module.service('dashboardLoaderSrv', function(backendSrv,
  16. dashboardSrv,
  17. datasourceSrv,
  18. $http, $q, $timeout,
  19. contextSrv, $routeParams,
  20. $rootScope) {
  21. var self = this;
  22. this._dashboardLoadFailed = function(title, snapshot) {
  23. snapshot = snapshot || false;
  24. return {
  25. meta: { canStar: false, isSnapshot: snapshot, canDelete: false, canSave: false, canEdit: false, dashboardNotFound: true },
  26. dashboard: {title: title }
  27. };
  28. };
  29. this.loadDashboard = function(type, slug) {
  30. var promise;
  31. if (type === 'script') {
  32. promise = this._loadScriptedDashboard(slug);
  33. } else if (type === 'snapshot') {
  34. promise = backendSrv.get('/api/snapshots/' + $routeParams.slug)
  35. .catch(function() {
  36. return self._dashboardLoadFailed("Snapshot not found", true);
  37. });
  38. } else {
  39. promise = backendSrv.getDashboard($routeParams.type, $routeParams.slug)
  40. .then(function(result) {
  41. if (result.meta.isFolder) {
  42. $rootScope.appEvent("alert-error", ['Dashboard not found']);
  43. throw new Error("Dashboard not found");
  44. }
  45. return result;
  46. })
  47. .catch(function() {
  48. return self._dashboardLoadFailed("Not found");
  49. });
  50. }
  51. promise.then(function(result) {
  52. if (result.meta.dashboardNotFound !== true) {
  53. impressionSrv.addDashboardImpression(result.dashboard.id);
  54. }
  55. return result;
  56. });
  57. return promise;
  58. };
  59. this._loadScriptedDashboard = function(file) {
  60. var url = 'public/dashboards/'+file.replace(/\.(?!js)/,"/") + '?' + new Date().getTime();
  61. return $http({ url: url, method: "GET" })
  62. .then(this._executeScript).then(function(result) {
  63. return { meta: { fromScript: true, canDelete: false, canSave: false, canStar: false}, dashboard: result.data };
  64. }, function(err) {
  65. console.log('Script dashboard error '+ err);
  66. $rootScope.appEvent('alert-error', ["Script Error", "Please make sure it exists and returns a valid dashboard"]);
  67. return self._dashboardLoadFailed('Scripted dashboard');
  68. });
  69. };
  70. this._executeScript = function(result) {
  71. var services = {
  72. dashboardSrv: dashboardSrv,
  73. datasourceSrv: datasourceSrv,
  74. $q: $q,
  75. };
  76. /*jshint -W054 */
  77. var script_func = new Function('ARGS','kbn','dateMath','_','moment','window','document','$','jQuery', 'services', result.data);
  78. var script_result = script_func($routeParams, kbn, dateMath, _ , moment, window, document, $, $, services);
  79. // Handle async dashboard scripts
  80. if (_.isFunction(script_result)) {
  81. var deferred = $q.defer();
  82. script_result(function(dashboard) {
  83. $timeout(function() {
  84. deferred.resolve({ data: dashboard });
  85. });
  86. });
  87. return deferred.promise;
  88. }
  89. return { data: script_result };
  90. };
  91. });
  92. });