|
|
@@ -12,7 +12,7 @@ import { updateLocation } from 'app/core/actions';
|
|
|
import { DashboardModel } from '../../state/DashboardModel';
|
|
|
|
|
|
export interface Props {
|
|
|
- dashboard: DashboardModel | null;
|
|
|
+ dashboard: DashboardModel;
|
|
|
editview: string;
|
|
|
isEditing: boolean;
|
|
|
isFullscreen: boolean;
|
|
|
@@ -25,7 +25,20 @@ export class DashNav extends PureComponent<Props> {
|
|
|
appEvents.emit('show-dash-search');
|
|
|
};
|
|
|
|
|
|
- onAddPanel = () => {};
|
|
|
+ onAddPanel = () => {
|
|
|
+ const { dashboard } = this.props;
|
|
|
+
|
|
|
+ // Return if the "Add panel" exists already
|
|
|
+ if (dashboard.panels.length > 0 && dashboard.panels[0].type === 'add-panel') {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ dashboard.addPanel({
|
|
|
+ type: 'add-panel',
|
|
|
+ gridPos: { x: 0, y: 0, w: 12, h: 8 },
|
|
|
+ title: 'Panel Title',
|
|
|
+ });
|
|
|
+ };
|
|
|
|
|
|
onClose = () => {
|
|
|
this.props.updateLocation({
|
|
|
@@ -34,6 +47,16 @@ export class DashNav extends PureComponent<Props> {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
+ onToggleTVMode = () => {
|
|
|
+ appEvents.emit('toggle-kiosk-mode');
|
|
|
+ };
|
|
|
+
|
|
|
+ onSave = () => {
|
|
|
+ const { $injector } = this.props;
|
|
|
+ const dashboardSrv = $injector.get('dashboardSrv');
|
|
|
+ dashboardSrv.saveDashboard();
|
|
|
+ };
|
|
|
+
|
|
|
onOpenSettings = () => {
|
|
|
this.props.updateLocation({
|
|
|
query: { editview: 'settings' },
|
|
|
@@ -51,30 +74,25 @@ export class DashNav extends PureComponent<Props> {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
- renderLoadingState() {
|
|
|
- return (
|
|
|
- <div className="navbar">
|
|
|
- <div>
|
|
|
- <a className="navbar-page-btn" onClick={this.onOpenSearch}>
|
|
|
- <i className="gicon gicon-dashboard" />
|
|
|
- Loading...
|
|
|
- <i className="fa fa-caret-down" />
|
|
|
- </a>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- );
|
|
|
- }
|
|
|
+ onOpenShare = () => {
|
|
|
+ const $rootScope = this.props.$injector.get('$rootScope');
|
|
|
+ const modalScope = $rootScope.$new();
|
|
|
+ modalScope.tabIndex = 0;
|
|
|
+ modalScope.dashboard = this.props.dashboard;
|
|
|
|
|
|
+ appEvents.emit('show-modal', {
|
|
|
+ src: 'public/app/features/dashboard/components/ShareModal/template.html',
|
|
|
+ scope: modalScope,
|
|
|
+ });
|
|
|
+ };
|
|
|
|
|
|
render() {
|
|
|
const { dashboard, isFullscreen, editview } = this.props;
|
|
|
-
|
|
|
- if (!dashboard) {
|
|
|
- return this.renderLoadingState();
|
|
|
- }
|
|
|
+ const { canEdit, canStar, canSave, canShare, folderTitle, showSettings, isStarred } = dashboard.meta;
|
|
|
+ const { snapshot } = dashboard;
|
|
|
|
|
|
const haveFolder = dashboard.meta.folderId > 0;
|
|
|
- const { canEdit, canStar, canSave, folderTitle, showSettings, isStarred } = dashboard.meta;
|
|
|
+ const snapshotUrl = snapshot && snapshot.originalUrl;
|
|
|
|
|
|
return (
|
|
|
<div className="navbar">
|
|
|
@@ -124,34 +142,50 @@ export class DashNav extends PureComponent<Props> {
|
|
|
</button>
|
|
|
)}
|
|
|
|
|
|
+ {canShare && (
|
|
|
+ <button
|
|
|
+ className="btn navbar-button navbar-button--share"
|
|
|
+ onClick={this.onOpenShare}
|
|
|
+ title="Share Dashboard"
|
|
|
+ >
|
|
|
+ <i className="fa fa-share-square-o" />
|
|
|
+ </button>
|
|
|
+ )}
|
|
|
+
|
|
|
+ {canSave && (
|
|
|
+ <button
|
|
|
+ className="btn navbar-button navbar-button--save"
|
|
|
+ onClick={this.onSave}
|
|
|
+ title="Save dashboard <br> CTRL+S"
|
|
|
+ >
|
|
|
+ <i className="fa fa-save" />
|
|
|
+ </button>
|
|
|
+ )}
|
|
|
+
|
|
|
+ {snapshotUrl && (
|
|
|
+ <a
|
|
|
+ className="btn navbar-button navbar-button--snapshot-origin"
|
|
|
+ href={snapshotUrl}
|
|
|
+ title="Open original dashboard"
|
|
|
+ >
|
|
|
+ <i className="fa fa-link" />
|
|
|
+ </a>
|
|
|
+ )}
|
|
|
+
|
|
|
+ <div className="navbar-buttons navbar-buttons--tv">
|
|
|
+ <button
|
|
|
+ className="btn navbar-button navbar-button--tv"
|
|
|
+ onClick={this.onToggleTVMode}
|
|
|
+ title="Cycle view mode"
|
|
|
+ >
|
|
|
+ <i className="fa fa-desktop" />
|
|
|
+ </button>
|
|
|
+ </div>
|
|
|
+
|
|
|
{
|
|
|
- //
|
|
|
- // <button class="btn navbar-button navbar-button--share" ng-show="::ctrl.dashboard.meta.canShare" ng-click="ctrl.shareDashboard(0)" bs-tooltip="'Share dashboard'" data-placement="bottom">
|
|
|
- // <i class="fa fa-share-square-o"></i></a>
|
|
|
- // </button>
|
|
|
- //
|
|
|
- // <button class="btn navbar-button navbar-button--save" ng-show="ctrl.dashboard.meta.canSave" ng-click="ctrl.saveDashboard()" bs-tooltip="'Save dashboard <br> CTRL+S'" data-placement="bottom">
|
|
|
- // <i class="fa fa-save"></i>
|
|
|
- // </button>
|
|
|
- //
|
|
|
- // <a class="btn navbar-button navbar-button--snapshot-origin" ng-if="::ctrl.dashboard.snapshot.originalUrl" href="{{ctrl.dashboard.snapshot.originalUrl}}" bs-tooltip="'Open original dashboard'" data-placement="bottom">
|
|
|
- // <i class="fa fa-link"></i>
|
|
|
- // </a>
|
|
|
- //
|
|
|
- // <button class="btn navbar-button navbar-button--settings" ng-click="ctrl.toggleSettings()" bs-tooltip="'Dashboard Settings'" data-placement="bottom" ng-show="ctrl.dashboard.meta.showSettings">
|
|
|
- // <i class="fa fa-cog"></i>
|
|
|
- // </button>
|
|
|
- // </div>
|
|
|
- //
|
|
|
- // <div class="navbar-buttons navbar-buttons--tv">
|
|
|
- // <button class="btn navbar-button navbar-button--tv" ng-click="ctrl.toggleViewMode()" bs-tooltip="'Cycle view mode'" data-placement="bottom">
|
|
|
- // <i class="fa fa-desktop"></i>
|
|
|
- // </button>
|
|
|
- // </div>
|
|
|
- //
|
|
|
// <gf-time-picker class="gf-timepicker-nav" dashboard="ctrl.dashboard" ng-if="!ctrl.dashboard.timepicker.hidden"></gf-time-picker>
|
|
|
- //
|
|
|
}
|
|
|
+
|
|
|
{(isFullscreen || editview) && (
|
|
|
<div className="navbar-buttons navbar-buttons--close">
|
|
|
<button
|