// Libaries import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import { css } from 'emotion'; 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 { ModalsController, Icon } from '@grafana/ui'; import { BackButton } from 'app/core/components/BackButton/BackButton'; // State import { updateLocation } from 'app/core/actions'; // Types import { DashboardModel } from '../../state'; import { CoreEvents, StoreState } from 'app/types'; import { ShareModal } from 'app/features/dashboard/components/ShareModal'; import { SaveDashboardModalProxy } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardModalProxy'; import { sanitizeUrl } from 'app/core/utils/text'; export interface OwnProps { dashboard: DashboardModel; isEditing: boolean; isFullscreen: boolean; $injector: any; updateLocation: typeof updateLocation; onAddPanel: () => void; } export interface StateProps { location: any; } type Props = StateProps & OwnProps; 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 = () => { this.props.updateLocation({ query: { panelId: null, edit: null, fullscreen: null, tab: null }, partial: true, }); }; onToggleTVMode = () => { appEvents.emit(CoreEvents.toggleKioskMode); }; 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(); }; renderDashboardTitleSearchButton() { const { dashboard, isFullscreen } = this.props; /* Hard-coded value so we don't have to wrap whole component in withTheme because of 1 variable */ const iconClassName = css` margin-right: 8px; margin-bottom: -1px; `; const mainIconClassName = css` margin-right: 8px; `; const folderTitle = dashboard.meta.folderTitle; const haveFolder = dashboard.meta.folderId > 0; return ( <>
{!isFullscreen && } {haveFolder && ( <> {folderTitle} )} {dashboard.title}
); } renderBackButton() { return (
); } render() { const { dashboard, onAddPanel, location, isFullscreen } = this.props; const { canStar, canSave, canShare, showSettings, isStarred } = dashboard.meta; const { snapshot } = dashboard; const snapshotUrl = snapshot && snapshot.originalUrl; return (
{isFullscreen && this.renderBackButton()} {this.renderDashboardTitleSearchButton()} {this.playlistSrv.isPlaying && (
)}
{canSave && ( )} {canStar && ( )} {canShare && ( {({ showModal, hideModal }) => ( { showModal(ShareModal, { dashboard, onDismiss: hideModal, }); }} /> )} )} {canSave && ( {({ showModal, hideModal }) => ( { showModal(SaveDashboardModalProxy, { dashboard, onDismiss: hideModal, }); }} /> )} )} {snapshotUrl && ( )} {showSettings && ( )}
{!dashboard.timepicker.hidden && (
)}
); } } const mapStateToProps = (state: StoreState) => ({ location: state.location, }); const mapDispatchToProps = { updateLocation, }; export default connect(mapStateToProps, mapDispatchToProps)(DashNav);