2016-04-14 15:53:19 -05:00
|
|
|
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';
|
2017-10-12 13:02:07 -05:00
|
|
|
import {DashboardModel} from './dashboard_model';
|
2016-04-14 15:53:19 -05:00
|
|
|
|
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;
|
2016-04-14 15:53:19 -05:00
|
|
|
|
|
|
|
/** @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;
|
2016-04-14 15:53:19 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
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);
|
2016-04-14 15:53:19 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
coreModule.controller('DashboardCtrl', DashboardCtrl);
|