grafana/public/app/features/dashboard/components/DashNav/DashNav.tsx

209 lines
5.8 KiB
TypeScript
Raw Normal View History

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;
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);