| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 |
- import config from 'app/core/config';
- import coreModule from 'app/core/core_module';
- import { PanelContainer } from './dashgrid/PanelContainer';
- import { DashboardModel } from './dashboard_model';
- import { PanelModel } from './panel_model';
- export class DashboardCtrl implements PanelContainer {
- dashboard: DashboardModel;
- dashboardViewState: any;
- loadedFallbackDashboard: boolean;
- editTab: number;
- /** @ngInject */
- constructor(
- private $scope,
- private $rootScope,
- private keybindingSrv,
- private timeSrv,
- private variableSrv,
- private alertingSrv,
- private dashboardSrv,
- private unsavedChangesSrv,
- private dashboardViewStateSrv,
- public playlistSrv,
- private panelLoader
- ) {
- // 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) {
- 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.dashboard.processRepeats();
- this.dashboard.updateSubmenuVisibility();
- this.dashboard.autoFitPanels(window.innerHeight);
- 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.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.dashboard.processRepeats();
- }
- setWindowTitleAndTheme() {
- window.document.title = config.window_title_prefix + this.dashboard.title;
- }
- showJsonEditor(evt, options) {
- const 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');
- }
- 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) {
- var 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);
- }
- init(dashboard) {
- 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));
- this.setupDashboard(dashboard);
- }
- }
- coreModule.controller('DashboardCtrl', DashboardCtrl);
|