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

185 lines
5.0 KiB
TypeScript
Raw Normal View History

// Utils
2017-12-20 05:33:33 -06:00
import config from 'app/core/config';
import appEvents from 'app/core/app_events';
2017-12-20 05:33:33 -06:00
import coreModule from 'app/core/core_module';
// Services
import { AnnotationsSrv } from '../annotations/annotations_srv';
// Types
2017-12-20 05:33:33 -06:00
import { DashboardModel } from './dashboard_model';
import { PanelModel } from './panel_model';
2018-06-19 14:25:57 -05:00
export class DashboardCtrl {
2017-10-10 02:34:14 -05:00
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 dashboardViewStateSrv,
private annotationsSrv: AnnotationsSrv,
2018-06-19 14:25:57 -05:00
public playlistSrv
) {
// temp hack due to way dashboards are loaded
// can't use controllerAs on route yet
$scope.ctrl = this;
// TODO: break out settings view to separate view & controller
this.editTab = 0;
// funcs called from React component bindings and needs this binding
this.getPanelContainer = this.getPanelContainer.bind(this);
}
setupDashboard(data) {
try {
this.setupDashboardInternal(data);
} catch (err) {
2017-12-20 05:33:33 -06:00
this.onInitFailed(err, 'Dashboard init failed', true);
2017-10-10 02:34:14 -05:00
}
}
2017-10-10 02:34:14 -05:00
setupDashboardInternal(data) {
const dashboard = this.dashboardSrv.create(data.dashboard, data.meta);
this.dashboardSrv.setCurrent(dashboard);
2017-10-10 02:34:14 -05:00
// init services
this.timeSrv.init(dashboard);
this.alertingSrv.init(dashboard, data.alerts);
this.annotationsSrv.init(dashboard);
2017-10-10 02:34:14 -05:00
// template values service needs to initialize completely before
// the rest of the dashboard can load
this.variableSrv
.init(dashboard)
2017-10-10 02:34:14 -05:00
// template values failes are non fatal
2017-12-20 05:33:33 -06:00
.catch(this.onInitFailed.bind(this, 'Templating init failed', false))
2017-10-10 02:34:14 -05:00
// continue
.finally(() => {
2017-10-12 14:37:27 -05:00
this.dashboard = dashboard;
this.dashboard.processRepeats();
this.dashboard.updateSubmenuVisibility();
this.dashboard.autoFitPanels(window.innerHeight);
2017-10-10 02:34:14 -05:00
this.unsavedChangesSrv.init(dashboard, this.$scope);
// TODO refactor ViewStateSrv
this.$scope.dashboard = dashboard;
this.dashboardViewState = this.dashboardViewStateSrv.create(this.$scope);
2017-10-10 02:34:14 -05:00
this.keybindingSrv.setupDashboardBindings(this.$scope, dashboard);
this.setWindowTitleAndTheme();
appEvents.emit('dashboard-initialized', dashboard);
2017-10-10 02:34:14 -05:00
})
2017-12-20 05:33:33 -06:00
.catch(this.onInitFailed.bind(this, 'Dashboard init failed', true));
}
2017-10-10 02:34:14 -05:00
onInitFailed(msg, fatal, err) {
console.log(msg, err);
2017-10-10 02:34:14 -05:00
if (err.data && err.data.message) {
err.message = err.data.message;
} else if (!err.message) {
err = { message: err.toString() };
2017-10-10 02:34:14 -05:00
}
2017-12-20 05:33:33 -06:00
this.$scope.appEvent('alert-error', [msg, err.message]);
// protect against recursive fallbacks
if (fatal && !this.loadedFallbackDashboard) {
this.loadedFallbackDashboard = true;
2017-12-20 05:33:33 -06:00
this.setupDashboard({ dashboard: { title: 'Dashboard Init failed' } });
}
}
templateVariableUpdated() {
this.dashboard.processRepeats();
}
setWindowTitleAndTheme() {
window.document.title = config.windowTitlePrefix + this.dashboard.title;
}
showJsonEditor(evt, options) {
const editScope = this.$rootScope.$new();
editScope.object = options.object;
editScope.updateHandler = options.updateHandler;
2017-12-20 05:33:33 -06:00
this.$scope.appEvent('show-dash-editor', {
src: 'public/app/partials/edit_json.html',
scope: editScope,
});
}
getDashboard() {
return this.dashboard;
}
getPanelContainer() {
return this;
}
onRemovingPanel(evt, options) {
options = options || {};
if (!options.panelId) {
return;
}
const panelInfo = this.dashboard.getPanelInfoById(options.panelId);
this.removePanel(panelInfo.panel, true);
}
removePanel(panel: PanelModel, ask: boolean) {
// confirm deletion
if (ask !== false) {
let text2, confirmText;
if (panel.alert) {
text2 = 'Panel includes an alert rule, removing panel will also remove alert rule';
confirmText = 'YES';
}
this.$scope.appEvent('confirm-modal', {
title: 'Remove Panel',
text: 'Are you sure you want to remove this panel?',
text2: text2,
icon: 'fa-trash',
confirmText: confirmText,
yesText: 'Remove',
onConfirm: () => {
this.removePanel(panel, false);
},
});
return;
}
this.dashboard.removePanel(panel);
}
2018-10-19 02:43:54 -05:00
onDestroy() {
if (this.dashboard) {
this.dashboard.destroy();
}
}
init(dashboard) {
2017-12-20 05:33:33 -06:00
this.$scope.onAppEvent('show-json-editor', this.showJsonEditor.bind(this));
this.$scope.onAppEvent('template-variable-value-updated', this.templateVariableUpdated.bind(this));
this.$scope.onAppEvent('panel-remove', this.onRemovingPanel.bind(this));
2018-10-19 02:43:54 -05:00
this.$scope.$on('$destroy', this.onDestroy.bind(this));
this.setupDashboard(dashboard);
}
}
2017-12-20 05:33:33 -06:00
coreModule.controller('DashboardCtrl', DashboardCtrl);