2019-02-03 03:55:58 -06:00
|
|
|
// Libaries
|
|
|
|
import React, { PureComponent } from 'react';
|
|
|
|
import { connect } from 'react-redux';
|
|
|
|
|
|
|
|
// Utils & Services
|
|
|
|
import { appEvents } from 'app/core/app_events';
|
|
|
|
|
2019-02-03 11:25:13 -06:00
|
|
|
// Components
|
|
|
|
import { DashNavButton } from './DashNavButton';
|
|
|
|
|
2019-02-03 03:55:58 -06:00
|
|
|
// State
|
|
|
|
import { updateLocation } from 'app/core/actions';
|
|
|
|
|
|
|
|
// Types
|
|
|
|
import { DashboardModel } from '../../state/DashboardModel';
|
|
|
|
|
|
|
|
export interface Props {
|
2019-02-03 08:29:14 -06:00
|
|
|
dashboard: DashboardModel;
|
2019-02-03 05:29:47 -06:00
|
|
|
editview: string;
|
|
|
|
isEditing: boolean;
|
|
|
|
isFullscreen: boolean;
|
2019-02-03 07:53:42 -06:00
|
|
|
$injector: any;
|
2019-02-03 03:55:58 -06:00
|
|
|
updateLocation: typeof updateLocation;
|
|
|
|
}
|
|
|
|
|
|
|
|
export class DashNav extends PureComponent<Props> {
|
|
|
|
onOpenSearch = () => {
|
|
|
|
appEvents.emit('show-dash-search');
|
|
|
|
};
|
|
|
|
|
2019-02-03 08:29:14 -06:00
|
|
|
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',
|
|
|
|
});
|
|
|
|
};
|
2019-02-03 07:53:42 -06:00
|
|
|
|
|
|
|
onClose = () => {
|
2019-02-03 11:25:13 -06:00
|
|
|
if (this.props.editview) {
|
|
|
|
this.props.updateLocation({
|
|
|
|
query: { editview: null },
|
|
|
|
partial: true,
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
this.props.updateLocation({
|
|
|
|
query: { panelId: null, edit: null, fullscreen: null },
|
|
|
|
partial: true,
|
|
|
|
});
|
|
|
|
}
|
2019-02-03 07:53:42 -06:00
|
|
|
};
|
|
|
|
|
2019-02-03 08:29:14 -06:00
|
|
|
onToggleTVMode = () => {
|
|
|
|
appEvents.emit('toggle-kiosk-mode');
|
|
|
|
};
|
|
|
|
|
|
|
|
onSave = () => {
|
|
|
|
const { $injector } = this.props;
|
|
|
|
const dashboardSrv = $injector.get('dashboardSrv');
|
|
|
|
dashboardSrv.saveDashboard();
|
|
|
|
};
|
|
|
|
|
2019-02-03 03:55:58 -06:00
|
|
|
onOpenSettings = () => {
|
|
|
|
this.props.updateLocation({
|
2019-02-03 07:53:42 -06:00
|
|
|
query: { editview: 'settings' },
|
2019-02-03 03:55:58 -06:00
|
|
|
partial: true,
|
2019-02-03 07:53:42 -06:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
onStarDashboard = () => {
|
|
|
|
const { $injector, dashboard } = this.props;
|
|
|
|
const dashboardSrv = $injector.get('dashboardSrv');
|
|
|
|
|
|
|
|
dashboardSrv.starDashboard(dashboard.id, dashboard.meta.isStarred).then(newState => {
|
|
|
|
dashboard.meta.isStarred = newState;
|
|
|
|
this.forceUpdate();
|
|
|
|
});
|
2019-02-03 03:55:58 -06:00
|
|
|
};
|
|
|
|
|
2019-02-03 08:29:14 -06:00
|
|
|
onOpenShare = () => {
|
|
|
|
const $rootScope = this.props.$injector.get('$rootScope');
|
|
|
|
const modalScope = $rootScope.$new();
|
|
|
|
modalScope.tabIndex = 0;
|
|
|
|
modalScope.dashboard = this.props.dashboard;
|
2019-02-03 03:55:58 -06:00
|
|
|
|
2019-02-03 08:29:14 -06:00
|
|
|
appEvents.emit('show-modal', {
|
|
|
|
src: 'public/app/features/dashboard/components/ShareModal/template.html',
|
|
|
|
scope: modalScope,
|
|
|
|
});
|
|
|
|
};
|
2019-02-03 07:53:42 -06:00
|
|
|
|
2019-02-03 03:55:58 -06:00
|
|
|
render() {
|
2019-02-03 07:53:42 -06:00
|
|
|
const { dashboard, isFullscreen, editview } = this.props;
|
2019-02-03 08:29:14 -06:00
|
|
|
const { canEdit, canStar, canSave, canShare, folderTitle, showSettings, isStarred } = dashboard.meta;
|
|
|
|
const { snapshot } = dashboard;
|
2019-02-03 03:55:58 -06:00
|
|
|
|
|
|
|
const haveFolder = dashboard.meta.folderId > 0;
|
2019-02-03 08:29:14 -06:00
|
|
|
const snapshotUrl = snapshot && snapshot.originalUrl;
|
2019-02-03 03:55:58 -06:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div className="navbar">
|
|
|
|
<div>
|
|
|
|
<a className="navbar-page-btn" onClick={this.onOpenSearch}>
|
|
|
|
<i className="gicon gicon-dashboard" />
|
|
|
|
{haveFolder && <span className="navbar-page-btn--folder">{folderTitle} / </span>}
|
|
|
|
{dashboard.title}
|
|
|
|
<i className="fa fa-caret-down" />
|
|
|
|
</a>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className="navbar__spacer" />
|
|
|
|
{/*
|
|
|
|
<div class="navbar-buttons navbar-buttons--playlist" ng-if="ctrl.playlistSrv.isPlaying">
|
|
|
|
<a class="navbar-button navbar-button--tight" ng-click="ctrl.playlistSrv.prev()"><i class="fa fa-step-backward"></i></a>
|
|
|
|
<a class="navbar-button navbar-button--tight" ng-click="ctrl.playlistSrv.stop()"><i class="fa fa-stop"></i></a>
|
|
|
|
<a class="navbar-button navbar-button--tight" ng-click="ctrl.playlistSrv.next()"><i class="fa fa-step-forward"></i></a>
|
|
|
|
</div>
|
|
|
|
*/}
|
|
|
|
|
|
|
|
<div className="navbar-buttons navbar-buttons--actions">
|
|
|
|
{canEdit && (
|
2019-02-03 11:25:13 -06:00
|
|
|
<DashNavButton
|
|
|
|
tooltip="Add panel"
|
|
|
|
classSuffix="add-panel"
|
|
|
|
icon="gicon gicon-add-panel"
|
|
|
|
onClick={this.onAddPanel}
|
|
|
|
/>
|
2019-02-03 03:55:58 -06:00
|
|
|
)}
|
|
|
|
|
2019-02-03 07:53:42 -06:00
|
|
|
{canStar && (
|
2019-02-03 13:38:13 -06:00
|
|
|
<DashNavButton
|
|
|
|
tooltip="Mark as favorite"
|
|
|
|
classSuffix="star"
|
|
|
|
icon={`${isStarred ? 'fa fa-star' : 'fa fa-star-o'}`}
|
2019-02-03 07:53:42 -06:00
|
|
|
onClick={this.onStarDashboard}
|
2019-02-03 13:38:13 -06:00
|
|
|
/>
|
2019-02-03 07:53:42 -06:00
|
|
|
)}
|
|
|
|
|
2019-02-03 08:29:14 -06:00
|
|
|
{canShare && (
|
2019-02-03 13:38:13 -06:00
|
|
|
<DashNavButton
|
|
|
|
tooltip="Share dashboard"
|
|
|
|
classSuffix="share"
|
|
|
|
icon="fa fa-share-square-o"
|
2019-02-03 08:29:14 -06:00
|
|
|
onClick={this.onOpenShare}
|
2019-02-03 13:38:13 -06:00
|
|
|
/>
|
2019-02-03 08:29:14 -06:00
|
|
|
)}
|
|
|
|
|
|
|
|
{canSave && (
|
2019-02-03 13:38:13 -06:00
|
|
|
<DashNavButton tooltip="Save dashboard" classSuffix="save" icon="fa fa-save" onClick={this.onSave} />
|
2019-02-03 08:29:14 -06:00
|
|
|
)}
|
|
|
|
|
|
|
|
{snapshotUrl && (
|
2019-02-03 13:38:13 -06:00
|
|
|
<DashNavButton
|
|
|
|
tooltip="Open original dashboard"
|
|
|
|
classSuffix="snapshot-origin"
|
|
|
|
icon="fa fa-link"
|
2019-02-03 08:29:14 -06:00
|
|
|
href={snapshotUrl}
|
2019-02-03 13:38:13 -06:00
|
|
|
/>
|
2019-02-03 08:29:14 -06:00
|
|
|
)}
|
2019-02-03 11:25:13 -06:00
|
|
|
|
|
|
|
{showSettings && (
|
2019-02-03 13:38:13 -06:00
|
|
|
<DashNavButton tooltip="Dashboard settings" classSuffix="settings" icon="fa fa-cog"
|
|
|
|
onClick={this.onOpenSettings} />
|
2019-02-03 11:25:13 -06:00
|
|
|
)}
|
2019-02-03 10:15:23 -06:00
|
|
|
</div>
|
|
|
|
|
|
|
|
<div className="navbar-buttons navbar-buttons--tv">
|
2019-02-03 13:38:13 -06:00
|
|
|
<DashNavButton
|
|
|
|
tooltip="Cycke view mode"
|
|
|
|
classSuffix="tv"
|
|
|
|
icon="fa fa-desktop"
|
|
|
|
onClick={this.onToggleTVMode}
|
|
|
|
/>
|
2019-02-03 10:15:23 -06:00
|
|
|
</div>
|
|
|
|
|
|
|
|
{
|
|
|
|
// <gf-time-picker class="gf-timepicker-nav" dashboard="ctrl.dashboard" ng-if="!ctrl.dashboard.timepicker.hidden"></gf-time-picker>
|
|
|
|
}
|
2019-02-03 08:29:14 -06:00
|
|
|
|
2019-02-03 10:15:23 -06:00
|
|
|
{(isFullscreen || editview) && (
|
|
|
|
<div className="navbar-buttons navbar-buttons--close">
|
2019-02-03 13:38:13 -06:00
|
|
|
<DashNavButton
|
|
|
|
tooltip="Back to dashboard"
|
|
|
|
classSuffix="primary"
|
|
|
|
icon="fa fa-reply"
|
2019-02-03 10:15:23 -06:00
|
|
|
onClick={this.onClose}
|
2019-02-03 13:38:13 -06:00
|
|
|
/>
|
2019-02-03 08:29:14 -06:00
|
|
|
</div>
|
2019-02-03 10:15:23 -06:00
|
|
|
)}
|
2019-02-03 03:55:58 -06:00
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-02-03 07:53:42 -06:00
|
|
|
const mapStateToProps = () => ({});
|
2019-02-03 03:55:58 -06:00
|
|
|
|
|
|
|
const mapDispatchToProps = {
|
2019-02-03 07:53:42 -06:00
|
|
|
updateLocation,
|
2019-02-03 03:55:58 -06:00
|
|
|
};
|
|
|
|
|
|
|
|
export default connect(mapStateToProps, mapDispatchToProps)(DashNav);
|