grafana/public/app/features/dashboard/dashboardLoaderSrv.js

101 lines
3.2 KiB
JavaScript
Raw Normal View History

define([
'angular',
'moment',
'lodash',
'jquery',
2015-10-30 08:44:40 -05:00
'app/core/utils/kbn',
'app/core/utils/datemath',
'./impression_store',
'app/core/config',
],
function (angular, moment, _, $, kbn, dateMath, impressionStore) {
'use strict';
var module = angular.module('grafana.services');
module.service('dashboardLoaderSrv', function(backendSrv,
dashboardSrv,
datasourceSrv,
$http, $q, $timeout,
contextSrv, $routeParams,
$rootScope) {
var self = this;
this._dashboardLoadFailed = function(title, snapshot) {
snapshot = snapshot || false;
return {
meta: { canStar: false, isSnapshot: snapshot, canDelete: false, canSave: false, canEdit: false, dashboardNotFound: true },
dashboard: {title: title }
};
};
this.loadDashboard = function(type, slug) {
var promise;
if (type === 'script') {
promise = this._loadScriptedDashboard(slug);
} else if (type === 'snapshot') {
promise = backendSrv.get('/api/snapshots/' + $routeParams.slug)
.catch(function() {
return self._dashboardLoadFailed("Snapshot not found", true);
});
} else {
promise = backendSrv.getDashboard($routeParams.type, $routeParams.slug)
.catch(function() {
return self._dashboardLoadFailed("Not found");
});
}
promise.then(function(result) {
if (result.meta.dashboardNotFound !== true) {
impressionStore.impressions.addDashboardImpression(result.dashboard.id);
}
return result;
});
return promise;
};
this._loadScriptedDashboard = function(file) {
var url = 'public/dashboards/'+file.replace(/\.(?!js)/,"/") + '?' + new Date().getTime();
return $http({ url: url, method: "GET" })
.then(this._executeScript).then(function(result) {
return { meta: { fromScript: true, canDelete: false, canSave: false, canStar: false}, dashboard: result.data };
}, function(err) {
console.log('Script dashboard error '+ err);
$rootScope.appEvent('alert-error', ["Script Error", "Please make sure it exists and returns a valid dashboard"]);
return self._dashboardLoadFailed('Scripted dashboard');
});
};
this._executeScript = function(result) {
var services = {
dashboardSrv: dashboardSrv,
datasourceSrv: datasourceSrv,
$q: $q,
};
/*jshint -W054 */
var script_func = new Function('ARGS','kbn','dateMath','_','moment','window','document','$','jQuery', 'services', result.data);
var script_result = script_func($routeParams, kbn, dateMath, _ , moment, window, document, $, $, services);
// Handle async dashboard scripts
if (_.isFunction(script_result)) {
var deferred = $q.defer();
script_result(function(dashboard) {
$timeout(function() {
deferred.resolve({ data: dashboard });
});
});
return deferred.promise;
}
return { data: script_result };
};
});
});