// Libaries import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import { e2e } from '@grafana/e2e'; // Utils & Services import { appEvents } from 'app/core/app_events'; import { PlaylistSrv } from 'app/features/playlist/playlist_srv'; // Components import { DashNavButton } from './DashNavButton'; import { DashNavTimeControls } from './DashNavTimeControls'; import { Tooltip } from '@grafana/ui'; // State import { updateLocation } from 'app/core/actions'; // Types import { DashboardModel } from '../../state'; import { CoreEvents, StoreState } from 'app/types'; export interface OwnProps { dashboard: DashboardModel; editview: string; isEditing: boolean; isFullscreen: boolean; $injector: any; updateLocation: typeof updateLocation; onAddPanel: () => void; } export interface StateProps { location: any; } type Props = StateProps & OwnProps; export class DashNav extends PureComponent { playlistSrv: PlaylistSrv; constructor(props: Props) { super(props); this.playlistSrv = this.props.$injector.get('playlistSrv'); } onDahboardNameClick = () => { appEvents.emit(CoreEvents.showDashSearch); }; onFolderNameClick = () => { appEvents.emit(CoreEvents.showDashSearch, { query: 'folder:current', }); }; onClose = () => { if (this.props.editview) { this.props.updateLocation({ query: { editview: null }, partial: true, }); } else { this.props.updateLocation({ query: { panelId: null, edit: null, fullscreen: null, tab: null }, partial: true, }); } }; onToggleTVMode = () => { appEvents.emit(CoreEvents.toggleKioskMode); }; onSave = () => { const { $injector } = this.props; const dashboardSrv = $injector.get('dashboardSrv'); dashboardSrv.saveDashboard(); }; onOpenSettings = () => { this.props.updateLocation({ query: { editview: 'settings' }, partial: true, }); }; onStarDashboard = () => { const { dashboard, $injector } = this.props; const dashboardSrv = $injector.get('dashboardSrv'); dashboardSrv.starDashboard(dashboard.id, dashboard.meta.isStarred).then((newState: any) => { dashboard.meta.isStarred = newState; this.forceUpdate(); }); }; onPlaylistPrev = () => { this.playlistSrv.prev(); }; onPlaylistNext = () => { this.playlistSrv.next(); }; onPlaylistStop = () => { this.playlistSrv.stop(); this.forceUpdate(); }; onOpenShare = () => { const $rootScope = this.props.$injector.get('$rootScope'); const modalScope = $rootScope.$new(); modalScope.tabIndex = 0; modalScope.dashboard = this.props.dashboard; appEvents.emit(CoreEvents.showModal, { src: 'public/app/features/dashboard/components/ShareModal/template.html', scope: modalScope, }); }; renderDashboardTitleSearchButton() { const { dashboard } = this.props; const folderTitle = dashboard.meta.folderTitle; const haveFolder = dashboard.meta.folderId > 0; return ( <>
{!this.isInFullscreenOrSettings && } {haveFolder && ( <> {folderTitle} )} {dashboard.title}
{this.isSettings &&  / Settings}
); } get isInFullscreenOrSettings() { return this.props.editview || this.props.isFullscreen; } get isSettings() { return this.props.editview; } renderBackButton() { return (
); } render() { const { dashboard, onAddPanel, location, $injector } = this.props; const { canStar, canSave, canShare, showSettings, isStarred } = dashboard.meta; const { snapshot } = dashboard; const snapshotUrl = snapshot && snapshot.originalUrl; return (
{this.isInFullscreenOrSettings && this.renderBackButton()} {this.renderDashboardTitleSearchButton()} {this.playlistSrv.isPlaying && (
)}
{canSave && ( )} {canStar && ( )} {canShare && ( )} {canSave && ( )} {snapshotUrl && ( )} {showSettings && ( )}
{!dashboard.timepicker.hidden && (
)}
); } } const mapStateToProps = (state: StoreState) => ({ location: state.location, }); const mapDispatchToProps = { updateLocation, }; export default connect(mapStateToProps, mapDispatchToProps)(DashNav);