dashboardLoaderSrv.js 3.2 KB

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