import { coreModule, appEvents, contextSrv } from 'app/core/core'; import { DashboardModel } from '../dashboard_model'; import $ from 'jquery'; import _ from 'lodash'; import config from 'app/core/config'; export class SettingsCtrl { dashboard: DashboardModel; isOpen: boolean; viewId: string; json: string; alertCount: number; canSaveAs: boolean; canSave: boolean; canDelete: boolean; sections: any[]; /** @ngInject */ constructor(private $scope, private $location, private $rootScope, private backendSrv, private dashboardSrv) { // temp hack for annotations and variables editors // that rely on inherited scope $scope.dashboard = this.dashboard; this.$scope.$on('$destroy', () => { this.dashboard.updateSubmenuVisibility(); this.$rootScope.$broadcast('refresh'); }); this.canSaveAs = contextSrv.isEditor; this.canSave = this.dashboard.meta.canSave; this.canDelete = this.dashboard.meta.canSave; this.buildSectionList(); this.onRouteUpdated(); $rootScope.onAppEvent('$routeUpdate', this.onRouteUpdated.bind(this), $scope); } buildSectionList() { this.sections = []; if (this.dashboard.meta.canEdit) { this.sections.push({ title: 'General', id: 'settings', icon: 'gicon gicon-preferences', }); this.sections.push({ title: 'Annotations', id: 'annotations', icon: 'gicon gicon-annotation', }); this.sections.push({ title: 'Variables', id: 'templating', icon: 'gicon gicon-variable', }); this.sections.push({ title: 'Links', id: 'links', icon: 'gicon gicon-link', }); } if (this.dashboard.id && this.dashboard.meta.canSave) { this.sections.push({ title: 'Versions', id: 'versions', icon: 'fa fa-fw fa-history', }); } if (this.dashboard.id && this.dashboard.meta.canAdmin) { this.sections.push({ title: 'Permissions', id: 'permissions', icon: 'fa fa-fw fa-lock', }); } if (this.dashboard.meta.canMakeEditable) { this.sections.push({ title: 'General', icon: 'gicon gicon-preferences', id: 'make_editable', }); } this.sections.push({ title: 'View JSON', id: 'view_json', icon: 'gicon gicon-json', }); const params = this.$location.search(); const url = this.$location.path(); for (let section of this.sections) { const sectionParams = _.defaults({ editview: section.id }, params); section.url = config.appSubUrl + url + '?' + $.param(sectionParams); } } onRouteUpdated() { this.viewId = this.$location.search().editview; if (this.viewId) { this.json = JSON.stringify(this.dashboard.getSaveModelClone(), null, 2); } if (this.viewId === 'settings' && this.dashboard.meta.canMakeEditable) { this.viewId = 'make_editable'; } const currentSection = _.find(this.sections, { id: this.viewId }); if (!currentSection) { this.sections.unshift({ title: 'Not found', id: '404', icon: 'fa fa-fw fa-warning', }); this.viewId = '404'; } } openSaveAsModal() { this.dashboardSrv.showSaveAsModal(); } saveDashboard() { this.dashboardSrv.saveDashboard(); } hideSettings() { var urlParams = this.$location.search(); delete urlParams.editview; setTimeout(() => { this.$rootScope.$apply(() => { this.$location.search(urlParams); }); }); } makeEditable() { this.dashboard.editable = true; this.dashboard.meta.canMakeEditable = false; this.dashboard.meta.canEdit = true; this.dashboard.meta.canSave = true; this.canDelete = true; this.viewId = 'settings'; this.buildSectionList(); const currentSection = _.find(this.sections, { id: this.viewId }); this.$location.url(currentSection.url); } deleteDashboard() { var confirmText = ''; var text2 = this.dashboard.title; const alerts = _.sumBy(this.dashboard.panels, panel => { return panel.alert ? 1 : 0; }); if (alerts > 0) { confirmText = 'DELETE'; text2 = `This dashboard contains ${alerts} alerts. Deleting this dashboard will also delete those alerts`; } appEvents.emit('confirm-modal', { title: 'Delete', text: 'Do you want to delete this dashboard?', text2: text2, icon: 'fa-trash', confirmText: confirmText, yesText: 'Delete', onConfirm: () => { this.dashboard.meta.canSave = false; this.deleteDashboardConfirmed(); }, }); } deleteDashboardConfirmed() { this.backendSrv.deleteDashboard(this.dashboard.uid).then(() => { appEvents.emit('alert-success', ['Dashboard Deleted', this.dashboard.title + ' has been deleted']); this.$location.url('/'); }); } onFolderChange(folder) { this.dashboard.meta.folderId = folder.id; this.dashboard.meta.folderTitle = folder.title; this.dashboard.meta.folderSlug = folder.slug; } } export function dashboardSettings() { return { restrict: 'E', templateUrl: 'public/app/features/dashboard/settings/settings.html', controller: SettingsCtrl, bindToController: true, controllerAs: 'ctrl', transclude: true, scope: { dashboard: '=' }, }; } coreModule.directive('dashboardSettings', dashboardSettings);