ux(dashboard): keybinding changes / new, #6442

This commit is contained in:
Torkel Ödegaard 2016-11-03 15:14:44 +01:00
parent 8ea2d3f19c
commit f91e067235
4 changed files with 53 additions and 14 deletions

View File

@ -1,6 +1,7 @@
///<reference path="../../headers/common.d.ts" /> ///<reference path="../../headers/common.d.ts" />
import $ from 'jquery'; import $ from 'jquery';
import _ from 'lodash';
import coreModule from 'app/core/core_module'; import coreModule from 'app/core/core_module';
import appEvents from 'app/core/app_events'; import appEvents from 'app/core/app_events';
@ -9,10 +10,15 @@ import Mousetrap from 'mousetrap';
export class KeybindingSrv { export class KeybindingSrv {
helpModal: boolean; helpModal: boolean;
bindings: any;
/** @ngInject */ /** @ngInject */
constructor(private $rootScope, private $modal, private $location, private contextSrv) { constructor(
private $rootScope,
private $modal,
private $location,
private contextSrv,
private $timeout) {
// clear out all shortcuts on route change // clear out all shortcuts on route change
$rootScope.$on('$routeChangeSuccess', () => { $rootScope.$on('$routeChangeSuccess', () => {
Mousetrap.reset(); Mousetrap.reset();
@ -23,9 +29,8 @@ export class KeybindingSrv {
this.setupGlobal(); this.setupGlobal();
} }
setupGlobal() { setupGlobal() {
this.bind("?", this.showHelpModal); this.bind(['?', 'h'], this.showHelpModal);
this.bind("g h", this.goToHome); this.bind("g h", this.goToHome);
this.bind("g a", this.openAlerting); this.bind("g a", this.openAlerting);
this.bind("g p", this.goToProfile); this.bind("g p", this.goToProfile);
@ -54,7 +59,6 @@ export class KeybindingSrv {
} }
showHelpModal() { showHelpModal() {
console.log('showing help modal');
appEvents.emit('show-modal', { appEvents.emit('show-modal', {
src: 'public/app/partials/help_modal.html', src: 'public/app/partials/help_modal.html',
model: {} model: {}
@ -69,6 +73,11 @@ export class KeybindingSrv {
}); });
} }
showDashEditView(view) {
var search = _.extend(this.$location.search(), {editview: view});
this.$location.search(search);
}
setupDashboardBindings(scope, dashboard) { setupDashboardBindings(scope, dashboard) {
this.bind('b', () => { this.bind('b', () => {
dashboard.toggleEditMode(); dashboard.toggleEditMode();
@ -82,11 +91,6 @@ export class KeybindingSrv {
this.bind(['ctrl+s', 'command+s'], () => { this.bind(['ctrl+s', 'command+s'], () => {
scope.appEvent('save-dashboard'); scope.appEvent('save-dashboard');
}); });
this.bind('r', () => {
scope.broadcastRefresh();
});
this.bind('ctrl+z', () => { this.bind('ctrl+z', () => {
scope.appEvent('zoom-out'); scope.appEvent('zoom-out');
}); });
@ -128,7 +132,7 @@ export class KeybindingSrv {
}); });
// delete panel // delete panel
this.bind('d', () => { this.bind('r', () => {
if (dashboard.meta.focusPanelId && dashboard.meta.canEdit) { if (dashboard.meta.focusPanelId && dashboard.meta.canEdit) {
var panelInfo = dashboard.getPanelInfoById(dashboard.meta.focusPanelId); var panelInfo = dashboard.getPanelInfoById(dashboard.meta.focusPanelId);
panelInfo.row.removePanel(panelInfo.panel); panelInfo.row.removePanel(panelInfo.panel);
@ -136,6 +140,29 @@ export class KeybindingSrv {
} }
}); });
// delete panel
this.bind('s', () => {
if (dashboard.meta.focusPanelId) {
var shareScope = scope.$new();
var panelInfo = dashboard.getPanelInfoById(dashboard.meta.focusPanelId);
shareScope.panel = panelInfo.panel;
shareScope.dashboard = dashboard;
appEvents.emit('show-modal', {
src: 'public/app/features/dashboard/partials/shareModal.html',
scope: shareScope
});
}
});
this.bind('d r', () => {
scope.broadcastRefresh();
});
this.bind('d s', () => {
this.showDashEditView('settings');
});
this.bind('esc', () => { this.bind('esc', () => {
var popups = $('.popover.in'); var popups = $('.popover.in');
if (popups.length > 0) { if (popups.length > 0) {

View File

@ -64,6 +64,11 @@
<li ng-if="dashboardMeta.canEdit"><a class="pointer" ng-click="viewJson();">View JSON</a></li> <li ng-if="dashboardMeta.canEdit"><a class="pointer" ng-click="viewJson();">View JSON</a></li>
<li ng-if="contextSrv.isEditor && !dashboard.editable"><a class="pointer" ng-click="makeEditable();">Make Editable</a></li> <li ng-if="contextSrv.isEditor && !dashboard.editable"><a class="pointer" ng-click="makeEditable();">Make Editable</a></li>
<li ng-if="contextSrv.isEditor"><a class="pointer" ng-click="saveDashboardAs();">Save As...</a></li> <li ng-if="contextSrv.isEditor"><a class="pointer" ng-click="saveDashboardAs();">Save As...</a></li>
<li class="dropdown-menu-item-with-shortcut">
<a class="pointer" ng-click="showHelpModal();">
Help <span class="dropdown-menu-item-shortcut">h</span>
</a>
</li>
<li ng-if="dashboardMeta.canSave"><a class="pointer" ng-click="deleteDashboard();">Delete dashboard</a></li> <li ng-if="dashboardMeta.canSave"><a class="pointer" ng-click="deleteDashboard();">Delete dashboard</a></li>
</ul> </ul>
</li> </li>

View File

@ -33,6 +33,13 @@ export class DashNavCtrl {
$location.search(search); $location.search(search);
}; };
$scope.showHelpModal = function() {
$scope.appEvent('show-modal', {
src: 'public/app/partials/help_modal.html',
model: {}
});
};
$scope.starDashboard = function() { $scope.starDashboard = function() {
if ($scope.dashboardMeta.isStarred) { if ($scope.dashboardMeta.isStarred) {
backendSrv.delete('/api/user/stars/dashboard/' + $scope.dashboard.id).then(function() { backendSrv.delete('/api/user/stars/dashboard/' + $scope.dashboard.id).then(function() {

View File

@ -53,21 +53,21 @@ var template = `
<h3 class="page-heading">Preferences</h3> <h3 class="page-heading">Preferences</h3>
<div class="gf-form"> <div class="gf-form">
<span class="gf-form-label width-9">UI Theme</span> <span class="gf-form-label width-10">UI Theme</span>
<div class="gf-form-select-wrapper max-width-20"> <div class="gf-form-select-wrapper max-width-20">
<select class="gf-form-input" ng-model="ctrl.prefs.theme" ng-options="f.value as f.text for f in ctrl.themes"></select> <select class="gf-form-input" ng-model="ctrl.prefs.theme" ng-options="f.value as f.text for f in ctrl.themes"></select>
</div> </div>
</div> </div>
<div class="gf-form"> <div class="gf-form">
<span class="gf-form-label width-9">Home Dashboard</span> <span class="gf-form-label width-10">Home Dashboard</span>
<dashboard-selector class="gf-form-select-wrapper max-width-20 gf-form-select-wrapper--has-help-icon" <dashboard-selector class="gf-form-select-wrapper max-width-20 gf-form-select-wrapper--has-help-icon"
model="ctrl.prefs.homeDashboardId"> model="ctrl.prefs.homeDashboardId">
</dashboard-selector> </dashboard-selector>
</div> </div>
<div class="gf-form"> <div class="gf-form">
<label class="gf-form-label width-9">Timezone</label> <label class="gf-form-label width-10">Timezone</label>
<div class="gf-form-select-wrapper max-width-20"> <div class="gf-form-select-wrapper max-width-20">
<select class="gf-form-input" ng-model="ctrl.prefs.timezone" ng-options="f.value as f.text for f in ctrl.timezones"></select> <select class="gf-form-input" ng-model="ctrl.prefs.timezone" ng-options="f.value as f.text for f in ctrl.timezones"></select>
</div> </div>