grafana/public/app/features/dashboard/dashboard_ctrl.ts

145 lines
4.2 KiB
TypeScript
Raw Normal View History

import config from 'app/core/config';
import coreModule from 'app/core/core_module';
2017-10-10 02:34:14 -05:00
import {PanelContainer} from './dashgrid/PanelContainer';
import {DashboardModel} from './dashboard_model';
2017-10-10 02:34:14 -05:00
export class DashboardCtrl implements PanelContainer {
dashboard: DashboardModel;
dashboardViewState: any;
loadedFallbackDashboard: boolean;
2017-10-10 10:57:53 -05:00
editTab: number;
/** @ngInject */
constructor(
private $scope,
2017-10-10 02:34:14 -05:00
private $rootScope,
private keybindingSrv,
private timeSrv,
private variableSrv,
private alertingSrv,
private dashboardSrv,
private unsavedChangesSrv,
private dynamicDashboardSrv,
private dashboardViewStateSrv,
private panelLoader) {
// temp hack due to way dashboards are loaded
// can't use controllerAs on route yet
$scope.ctrl = this;
2017-10-10 10:57:53 -05:00
// TODO: break out settings view to separate view & controller
this.editTab = 0;
2017-10-10 02:34:14 -05:00
// funcs called from React component bindings and needs this binding
this.getPanelContainer = this.getPanelContainer.bind(this);
}
setupDashboard(data) {
try {
this.setupDashboardInternal(data);
} catch (err) {
this.onInitFailed(err, 'Dashboard init failed', true);
}
}
setupDashboardInternal(data) {
const dashboard = this.dashboardSrv.create(data.dashboard, data.meta);
this.dashboardSrv.setCurrent(dashboard);
// init services
this.timeSrv.init(dashboard);
this.alertingSrv.init(dashboard, data.alerts);
// template values service needs to initialize completely before
// the rest of the dashboard can load
this.variableSrv.init(dashboard)
// template values failes are non fatal
.catch(this.onInitFailed.bind(this, 'Templating init failed', false))
// continue
.finally(() => {
this.dashboard = dashboard;
this.dynamicDashboardSrv.init(dashboard);
this.dynamicDashboardSrv.process();
this.unsavedChangesSrv.init(dashboard, this.$scope);
// TODO refactor ViewStateSrv
this.$scope.dashboard = dashboard;
this.dashboardViewState = this.dashboardViewStateSrv.create(this.$scope);
this.keybindingSrv.setupDashboardBindings(this.$scope, dashboard);
this.dashboard.updateSubmenuVisibility();
this.setWindowTitleAndTheme();
this.$scope.appEvent("dashboard-initialized", dashboard);
})
.catch(this.onInitFailed.bind(this, 'Dashboard init failed', true));
}
onInitFailed(msg, fatal, err) {
console.log(msg, err);
if (err.data && err.data.message) {
err.message = err.data.message;
} else if (!err.message) {
err = {message: err.toString()};
}
this.$scope.appEvent("alert-error", [msg, err.message]);
// protect against recursive fallbacks
if (fatal && !this.loadedFallbackDashboard) {
this.loadedFallbackDashboard = true;
this.setupDashboard({dashboard: {title: 'Dashboard Init failed'}});
}
}
templateVariableUpdated() {
this.dynamicDashboardSrv.process();
}
setWindowTitleAndTheme() {
window.document.title = config.window_title_prefix + this.dashboard.title;
}
showJsonEditor(evt, options) {
var editScope = this.$rootScope.$new();
editScope.object = options.object;
editScope.updateHandler = options.updateHandler;
this.$scope.appEvent('show-dash-editor', { src: 'public/app/partials/edit_json.html', scope: editScope });
}
getDashboard() {
return this.dashboard;
}
getPanelLoader() {
return this.panelLoader;
}
timezoneChanged() {
this.$rootScope.$broadcast("refresh");
}
onFolderChange(folder) {
this.dashboard.folderId = folder.id;
this.dashboard.meta.folderId = folder.id;
this.dashboard.meta.folderTitle= folder.title;
}
getPanelContainer() {
console.log('DashboardCtrl:getPanelContainer()');
return this;
}
init(dashboard) {
2017-10-12 10:38:49 -05:00
this.$scope.onAppEvent('show-json-editor', this.showJsonEditor.bind(this));
this.$scope.onAppEvent('template-variable-value-updated', this.templateVariableUpdated.bind(this));
2017-10-10 02:34:14 -05:00
this.setupDashboard(dashboard);
}
}
coreModule.controller('DashboardCtrl', DashboardCtrl);