Commit cfe81510 by Marcus Efraimsson Committed by GitHub

Merge pull request #12796 from dehrax/12768-panel-heights

WIP: Fit panels to screen height
parents f43735ac 2ad35821
...@@ -15,7 +15,14 @@ export class KeybindingSrv { ...@@ -15,7 +15,14 @@ export class KeybindingSrv {
timepickerOpen = false; timepickerOpen = false;
/** @ngInject */ /** @ngInject */
constructor(private $rootScope, private $location, private datasourceSrv, private timeSrv, private contextSrv) { constructor(
private $rootScope,
private $location,
private datasourceSrv,
private timeSrv,
private contextSrv,
private $route
) {
// clear out all shortcuts on route change // clear out all shortcuts on route change
$rootScope.$on('$routeChangeSuccess', () => { $rootScope.$on('$routeChangeSuccess', () => {
Mousetrap.reset(); Mousetrap.reset();
...@@ -259,6 +266,14 @@ export class KeybindingSrv { ...@@ -259,6 +266,14 @@ export class KeybindingSrv {
this.bind('d v', () => { this.bind('d v', () => {
appEvents.emit('toggle-view-mode'); appEvents.emit('toggle-view-mode');
}); });
//Autofit panels
this.bind('d a', () => {
this.$location.search('autofitpanels', this.$location.search().autofitpanels ? null : true);
//Force reload
this.$route.reload();
});
} }
} }
......
...@@ -62,6 +62,8 @@ export class DashboardCtrl implements PanelContainer { ...@@ -62,6 +62,8 @@ export class DashboardCtrl implements PanelContainer {
.finally(() => { .finally(() => {
this.dashboard = dashboard; this.dashboard = dashboard;
this.dashboard.processRepeats(); this.dashboard.processRepeats();
this.dashboard.updateSubmenuVisibility();
this.dashboard.autoFitPanels(window.innerHeight);
this.unsavedChangesSrv.init(dashboard, this.$scope); this.unsavedChangesSrv.init(dashboard, this.$scope);
...@@ -70,8 +72,6 @@ export class DashboardCtrl implements PanelContainer { ...@@ -70,8 +72,6 @@ export class DashboardCtrl implements PanelContainer {
this.dashboardViewState = this.dashboardViewStateSrv.create(this.$scope); this.dashboardViewState = this.dashboardViewStateSrv.create(this.$scope);
this.keybindingSrv.setupDashboardBindings(this.$scope, dashboard); this.keybindingSrv.setupDashboardBindings(this.$scope, dashboard);
this.dashboard.updateSubmenuVisibility();
this.setWindowTitleAndTheme(); this.setWindowTitleAndTheme();
this.$scope.appEvent('dashboard-initialized', dashboard); this.$scope.appEvent('dashboard-initialized', dashboard);
......
import moment from 'moment'; import moment from 'moment';
import _ from 'lodash'; import _ from 'lodash';
import { GRID_COLUMN_COUNT, REPEAT_DIR_VERTICAL } from 'app/core/constants'; import { GRID_COLUMN_COUNT, REPEAT_DIR_VERTICAL, GRID_CELL_HEIGHT, GRID_CELL_VMARGIN } from 'app/core/constants';
import { DEFAULT_ANNOTATION_COLOR } from 'app/core/utils/colors'; import { DEFAULT_ANNOTATION_COLOR } from 'app/core/utils/colors';
import { Emitter } from 'app/core/utils/emitter'; import { Emitter } from 'app/core/utils/emitter';
import { contextSrv } from 'app/core/services/context_srv'; import { contextSrv } from 'app/core/services/context_srv';
...@@ -830,4 +830,32 @@ export class DashboardModel { ...@@ -830,4 +830,32 @@ export class DashboardModel {
return !_.isEqual(updated, this.originalTemplating); return !_.isEqual(updated, this.originalTemplating);
} }
autoFitPanels(viewHeight: number) {
if (!this.meta.autofitpanels) {
return;
}
const currentGridHeight = Math.max(
...this.panels.map(panel => {
return panel.gridPos.h + panel.gridPos.y;
})
);
// Consider navbar and submenu controls, padding and margin
let visibleHeight = window.innerHeight - 55 - 20;
// Remove submenu if visible
if (this.meta.submenuEnabled) {
visibleHeight -= 50;
}
const visibleGridHeight = Math.floor(visibleHeight / (GRID_CELL_HEIGHT + GRID_CELL_VMARGIN));
const scaleFactor = currentGridHeight / visibleGridHeight;
this.panels.forEach((panel, i) => {
panel.gridPos.y = Math.round(panel.gridPos.y / scaleFactor) || 1;
panel.gridPos.h = Math.round(panel.gridPos.h / scaleFactor) || 1;
});
}
} }
...@@ -38,9 +38,10 @@ export class LoadDashboardCtrl { ...@@ -38,9 +38,10 @@ export class LoadDashboardCtrl {
} }
} }
if ($routeParams.keepRows) { if ($routeParams.autofitpanels) {
result.meta.keepRows = true; result.meta.autofitpanels = true;
} }
$scope.initDashboard(result, $scope); $scope.initDashboard(result, $scope);
}); });
} }
......
.dashboard-container { .dashboard-container {
padding: $dashboard-padding; padding: $dashboard-padding $dashboard-padding 0 $dashboard-padding;
width: 100%; width: 100%;
min-height: 100%; min-height: 100%;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment