DashNav.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. // Libaries
  2. import React, { PureComponent } from 'react';
  3. import { connect } from 'react-redux';
  4. // Utils & Services
  5. import { AngularComponent, getAngularLoader } from 'app/core/services/AngularLoader';
  6. import { appEvents } from 'app/core/app_events';
  7. import { PlaylistSrv } from 'app/features/playlist/playlist_srv';
  8. // Components
  9. import { DashNavButton } from './DashNavButton';
  10. // State
  11. import { updateLocation } from 'app/core/actions';
  12. // Types
  13. import { DashboardModel } from '../../state/DashboardModel';
  14. export interface Props {
  15. dashboard: DashboardModel;
  16. editview: string;
  17. isEditing: boolean;
  18. isFullscreen: boolean;
  19. $injector: any;
  20. updateLocation: typeof updateLocation;
  21. onAddPanel: () => void;
  22. }
  23. export class DashNav extends PureComponent<Props> {
  24. timePickerEl: HTMLElement;
  25. timepickerCmp: AngularComponent;
  26. playlistSrv: PlaylistSrv;
  27. constructor(props: Props) {
  28. super(props);
  29. this.playlistSrv = this.props.$injector.get('playlistSrv');
  30. }
  31. componentDidMount() {
  32. const loader = getAngularLoader();
  33. const template =
  34. '<gf-time-picker class="gf-timepicker-nav" dashboard="dashboard" ng-if="!dashboard.timepicker.hidden" />';
  35. const scopeProps = { dashboard: this.props.dashboard };
  36. this.timepickerCmp = loader.load(this.timePickerEl, scopeProps, template);
  37. }
  38. componentWillUnmount() {
  39. if (this.timepickerCmp) {
  40. this.timepickerCmp.destroy();
  41. }
  42. }
  43. onOpenSearch = () => {
  44. appEvents.emit('show-dash-search');
  45. };
  46. onClose = () => {
  47. if (this.props.editview) {
  48. this.props.updateLocation({
  49. query: { editview: null },
  50. partial: true,
  51. });
  52. } else {
  53. this.props.updateLocation({
  54. query: { panelId: null, edit: null, fullscreen: null },
  55. partial: true,
  56. });
  57. }
  58. };
  59. onToggleTVMode = () => {
  60. appEvents.emit('toggle-kiosk-mode');
  61. };
  62. onSave = () => {
  63. const { $injector } = this.props;
  64. const dashboardSrv = $injector.get('dashboardSrv');
  65. dashboardSrv.saveDashboard();
  66. };
  67. onOpenSettings = () => {
  68. this.props.updateLocation({
  69. query: { editview: 'settings' },
  70. partial: true,
  71. });
  72. };
  73. onStarDashboard = () => {
  74. const { dashboard, $injector } = this.props;
  75. const dashboardSrv = $injector.get('dashboardSrv');
  76. dashboardSrv.starDashboard(dashboard.id, dashboard.meta.isStarred).then(newState => {
  77. dashboard.meta.isStarred = newState;
  78. this.forceUpdate();
  79. });
  80. };
  81. onPlaylistPrev = () => {
  82. this.playlistSrv.prev();
  83. };
  84. onPlaylistNext = () => {
  85. this.playlistSrv.next();
  86. };
  87. onPlaylistStop = () => {
  88. this.playlistSrv.stop();
  89. this.forceUpdate();
  90. };
  91. onOpenShare = () => {
  92. const $rootScope = this.props.$injector.get('$rootScope');
  93. const modalScope = $rootScope.$new();
  94. modalScope.tabIndex = 0;
  95. modalScope.dashboard = this.props.dashboard;
  96. appEvents.emit('show-modal', {
  97. src: 'public/app/features/dashboard/components/ShareModal/template.html',
  98. scope: modalScope,
  99. });
  100. };
  101. render() {
  102. const { dashboard, isFullscreen, editview, onAddPanel } = this.props;
  103. const { canStar, canSave, canShare, folderTitle, showSettings, isStarred } = dashboard.meta;
  104. const { snapshot } = dashboard;
  105. const haveFolder = dashboard.meta.folderId > 0;
  106. const snapshotUrl = snapshot && snapshot.originalUrl;
  107. return (
  108. <div className="navbar">
  109. <div>
  110. <a className="navbar-page-btn" onClick={this.onOpenSearch}>
  111. <i className="gicon gicon-dashboard" />
  112. {haveFolder && <span className="navbar-page-btn--folder">{folderTitle} / </span>}
  113. {dashboard.title}
  114. <i className="fa fa-caret-down" />
  115. </a>
  116. </div>
  117. <div className="navbar__spacer" />
  118. {this.playlistSrv.isPlaying && (
  119. <div className="navbar-buttons navbar-buttons--playlist">
  120. <DashNavButton
  121. tooltip="Go to previous dashboard"
  122. classSuffix="tight"
  123. icon="fa fa-step-backward"
  124. onClick={this.onPlaylistPrev}
  125. />
  126. <DashNavButton
  127. tooltip="Stop playlist"
  128. classSuffix="tight"
  129. icon="fa fa-stop"
  130. onClick={this.onPlaylistStop}
  131. />
  132. <DashNavButton
  133. tooltip="Go to next dashboard"
  134. classSuffix="tight"
  135. icon="fa fa-forward"
  136. onClick={this.onPlaylistNext}
  137. />
  138. </div>
  139. )}
  140. <div className="navbar-buttons navbar-buttons--actions">
  141. {canSave && (
  142. <DashNavButton
  143. tooltip="Add panel"
  144. classSuffix="add-panel"
  145. icon="gicon gicon-add-panel"
  146. onClick={onAddPanel}
  147. />
  148. )}
  149. {canStar && (
  150. <DashNavButton
  151. tooltip="Mark as favorite"
  152. classSuffix="star"
  153. icon={`${isStarred ? 'fa fa-star' : 'fa fa-star-o'}`}
  154. onClick={this.onStarDashboard}
  155. />
  156. )}
  157. {canShare && (
  158. <DashNavButton
  159. tooltip="Share dashboard"
  160. classSuffix="share"
  161. icon="fa fa-share-square-o"
  162. onClick={this.onOpenShare}
  163. />
  164. )}
  165. {canSave && (
  166. <DashNavButton tooltip="Save dashboard" classSuffix="save" icon="fa fa-save" onClick={this.onSave} />
  167. )}
  168. {snapshotUrl && (
  169. <DashNavButton
  170. tooltip="Open original dashboard"
  171. classSuffix="snapshot-origin"
  172. icon="fa fa-link"
  173. href={snapshotUrl}
  174. />
  175. )}
  176. {showSettings && (
  177. <DashNavButton
  178. tooltip="Dashboard settings"
  179. classSuffix="settings"
  180. icon="fa fa-cog"
  181. onClick={this.onOpenSettings}
  182. />
  183. )}
  184. </div>
  185. <div className="navbar-buttons navbar-buttons--tv">
  186. <DashNavButton
  187. tooltip="Cycke view mode"
  188. classSuffix="tv"
  189. icon="fa fa-desktop"
  190. onClick={this.onToggleTVMode}
  191. />
  192. </div>
  193. <div className="gf-timepicker-nav" ref={element => (this.timePickerEl = element)} />
  194. {(isFullscreen || editview) && (
  195. <div className="navbar-buttons navbar-buttons--close">
  196. <DashNavButton
  197. tooltip="Back to dashboard"
  198. classSuffix="primary"
  199. icon="fa fa-reply"
  200. onClick={this.onClose}
  201. />
  202. </div>
  203. )}
  204. </div>
  205. );
  206. }
  207. }
  208. const mapStateToProps = () => ({});
  209. const mapDispatchToProps = {
  210. updateLocation,
  211. };
  212. export default connect(mapStateToProps, mapDispatchToProps)(DashNav);