| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290 |
- // Libaries
- import React, { PureComponent } from 'react';
- import { connect } from 'react-redux';
- // 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 { 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<Props> {
- playlistSrv: PlaylistSrv;
- constructor(props: Props) {
- super(props);
- this.playlistSrv = this.props.$injector.get('playlistSrv');
- }
- onDahboardNameClick = () => {
- appEvents.emit('show-dash-search');
- };
- onFolderNameClick = () => {
- appEvents.emit('show-dash-search', {
- 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('toggle-kiosk-mode');
- };
- 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('show-modal', {
- 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 (
- <>
- <div>
- <div className="navbar-page-btn">
- {!this.isInFullscreenOrSettings && <i className="gicon gicon-dashboard" />}
- {haveFolder && (
- <>
- <a className="navbar-page-btn__folder" onClick={this.onFolderNameClick}>
- {folderTitle}
- </a>
- <i className="fa fa-chevron-right navbar-page-btn__folder-icon" />
- </>
- )}
- <a onClick={this.onDahboardNameClick}>
- {dashboard.title} <i className="fa fa-caret-down navbar-page-btn__search" />
- </a>
- </div>
- </div>
- {this.isSettings && <span className="navbar-settings-title"> / Settings</span>}
- <div className="navbar__spacer" />
- </>
- );
- }
- get isInFullscreenOrSettings() {
- return this.props.editview || this.props.isFullscreen;
- }
- get isSettings() {
- return this.props.editview;
- }
- renderBackButton() {
- return (
- <div className="navbar-edit">
- <Tooltip content="Go back (Esc)">
- <button className="navbar-edit__back-btn" onClick={this.onClose}>
- <i className="fa fa-arrow-left" />
- </button>
- </Tooltip>
- </div>
- );
- }
- 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 (
- <div className="navbar">
- {this.isInFullscreenOrSettings && this.renderBackButton()}
- {this.renderDashboardTitleSearchButton()}
- {this.playlistSrv.isPlaying && (
- <div className="navbar-buttons navbar-buttons--playlist">
- <DashNavButton
- tooltip="Go to previous dashboard"
- classSuffix="tight"
- icon="fa fa-step-backward"
- onClick={this.onPlaylistPrev}
- />
- <DashNavButton
- tooltip="Stop playlist"
- classSuffix="tight"
- icon="fa fa-stop"
- onClick={this.onPlaylistStop}
- />
- <DashNavButton
- tooltip="Go to next dashboard"
- classSuffix="tight"
- icon="fa fa-forward"
- onClick={this.onPlaylistNext}
- />
- </div>
- )}
- <div className="navbar-buttons navbar-buttons--actions">
- {canSave && (
- <DashNavButton
- tooltip="Add panel"
- classSuffix="add-panel"
- icon="gicon gicon-add-panel"
- onClick={onAddPanel}
- />
- )}
- {canStar && (
- <DashNavButton
- tooltip="Mark as favorite"
- classSuffix="star"
- icon={`${isStarred ? 'fa fa-star' : 'fa fa-star-o'}`}
- onClick={this.onStarDashboard}
- />
- )}
- {canShare && (
- <DashNavButton
- tooltip="Share dashboard"
- classSuffix="share"
- icon="fa fa-share-square-o"
- onClick={this.onOpenShare}
- />
- )}
- {canSave && (
- <DashNavButton tooltip="Save dashboard" classSuffix="save" icon="fa fa-save" onClick={this.onSave} />
- )}
- {snapshotUrl && (
- <DashNavButton
- tooltip="Open original dashboard"
- classSuffix="snapshot-origin"
- icon="gicon gicon-link"
- href={snapshotUrl}
- />
- )}
- {showSettings && (
- <DashNavButton
- tooltip="Dashboard settings"
- classSuffix="settings"
- icon="gicon gicon-cog"
- onClick={this.onOpenSettings}
- />
- )}
- </div>
- <div className="navbar-buttons navbar-buttons--tv">
- <DashNavButton
- tooltip="Cycle view mode"
- classSuffix="tv"
- icon="fa fa-desktop"
- onClick={this.onToggleTVMode}
- />
- </div>
- {!dashboard.timepicker.hidden && (
- <div className="navbar-buttons">
- <DashNavTimeControls
- $injector={$injector}
- dashboard={dashboard}
- location={location}
- updateLocation={updateLocation}
- />
- </div>
- )}
- </div>
- );
- }
- }
- const mapStateToProps = (state: StoreState) => ({
- location: state.location,
- });
- const mapDispatchToProps = {
- updateLocation,
- };
- export default connect(
- mapStateToProps,
- mapDispatchToProps
- )(DashNav);
|