DashNav.tsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. // Libaries
  2. import React, { PureComponent } from 'react';
  3. import { connect } from 'react-redux';
  4. // Utils & Services
  5. import { appEvents } from 'app/core/app_events';
  6. // State
  7. import { updateLocation } from 'app/core/actions';
  8. // Types
  9. import { DashboardModel } from '../../state/DashboardModel';
  10. export interface Props {
  11. dashboard: DashboardModel;
  12. editview: string;
  13. isEditing: boolean;
  14. isFullscreen: boolean;
  15. $injector: any;
  16. updateLocation: typeof updateLocation;
  17. }
  18. export class DashNav extends PureComponent<Props> {
  19. onOpenSearch = () => {
  20. appEvents.emit('show-dash-search');
  21. };
  22. onAddPanel = () => {
  23. const { dashboard } = this.props;
  24. // Return if the "Add panel" exists already
  25. if (dashboard.panels.length > 0 && dashboard.panels[0].type === 'add-panel') {
  26. return;
  27. }
  28. dashboard.addPanel({
  29. type: 'add-panel',
  30. gridPos: { x: 0, y: 0, w: 12, h: 8 },
  31. title: 'Panel Title',
  32. });
  33. };
  34. onClose = () => {
  35. this.props.updateLocation({
  36. query: { editview: null, panelId: null, edit: null, fullscreen: null },
  37. partial: true,
  38. });
  39. };
  40. onToggleTVMode = () => {
  41. appEvents.emit('toggle-kiosk-mode');
  42. };
  43. onSave = () => {
  44. const { $injector } = this.props;
  45. const dashboardSrv = $injector.get('dashboardSrv');
  46. dashboardSrv.saveDashboard();
  47. };
  48. onOpenSettings = () => {
  49. this.props.updateLocation({
  50. query: { editview: 'settings' },
  51. partial: true,
  52. });
  53. };
  54. onStarDashboard = () => {
  55. const { $injector, dashboard } = this.props;
  56. const dashboardSrv = $injector.get('dashboardSrv');
  57. dashboardSrv.starDashboard(dashboard.id, dashboard.meta.isStarred).then(newState => {
  58. dashboard.meta.isStarred = newState;
  59. this.forceUpdate();
  60. });
  61. };
  62. onOpenShare = () => {
  63. const $rootScope = this.props.$injector.get('$rootScope');
  64. const modalScope = $rootScope.$new();
  65. modalScope.tabIndex = 0;
  66. modalScope.dashboard = this.props.dashboard;
  67. appEvents.emit('show-modal', {
  68. src: 'public/app/features/dashboard/components/ShareModal/template.html',
  69. scope: modalScope,
  70. });
  71. };
  72. render() {
  73. const { dashboard, isFullscreen, editview } = this.props;
  74. const { canEdit, canStar, canSave, canShare, folderTitle, showSettings, isStarred } = dashboard.meta;
  75. const { snapshot } = dashboard;
  76. const haveFolder = dashboard.meta.folderId > 0;
  77. const snapshotUrl = snapshot && snapshot.originalUrl;
  78. return (
  79. <div className="navbar">
  80. <div>
  81. <a className="navbar-page-btn" onClick={this.onOpenSearch}>
  82. <i className="gicon gicon-dashboard" />
  83. {haveFolder && <span className="navbar-page-btn--folder">{folderTitle} / </span>}
  84. {dashboard.title}
  85. <i className="fa fa-caret-down" />
  86. </a>
  87. </div>
  88. <div className="navbar__spacer" />
  89. {/*
  90. <div class="navbar-buttons navbar-buttons--playlist" ng-if="ctrl.playlistSrv.isPlaying">
  91. <a class="navbar-button navbar-button--tight" ng-click="ctrl.playlistSrv.prev()"><i class="fa fa-step-backward"></i></a>
  92. <a class="navbar-button navbar-button--tight" ng-click="ctrl.playlistSrv.stop()"><i class="fa fa-stop"></i></a>
  93. <a class="navbar-button navbar-button--tight" ng-click="ctrl.playlistSrv.next()"><i class="fa fa-step-forward"></i></a>
  94. </div>
  95. */}
  96. <div className="navbar-buttons navbar-buttons--actions">
  97. {canEdit && (
  98. <button className="btn navbar-button navbar-button--add-panel" title="Add panel" onClick={this.onAddPanel}>
  99. <i className="gicon gicon-add-panel" />
  100. </button>
  101. )}
  102. {showSettings && (
  103. <button
  104. className="btn navbar-button navbar-button--settings"
  105. onClick={this.onOpenSettings}
  106. title="Dashboard Settings"
  107. >
  108. <i className="fa fa-cog" />
  109. </button>
  110. )}
  111. {canStar && (
  112. <button
  113. className="btn navbar-button navbar-button--star"
  114. onClick={this.onStarDashboard}
  115. title="Mark as favorite"
  116. >
  117. {isStarred && <i className="fa fa-star" />}
  118. {!isStarred && <i className="fa fa-star-o" />}
  119. </button>
  120. )}
  121. {canShare && (
  122. <button
  123. className="btn navbar-button navbar-button--share"
  124. onClick={this.onOpenShare}
  125. title="Share Dashboard"
  126. >
  127. <i className="fa fa-share-square-o" />
  128. </button>
  129. )}
  130. {canSave && (
  131. <button
  132. className="btn navbar-button navbar-button--save"
  133. onClick={this.onSave}
  134. title="Save dashboard <br> CTRL+S"
  135. >
  136. <i className="fa fa-save" />
  137. </button>
  138. )}
  139. {snapshotUrl && (
  140. <a
  141. className="btn navbar-button navbar-button--snapshot-origin"
  142. href={snapshotUrl}
  143. title="Open original dashboard"
  144. >
  145. <i className="fa fa-link" />
  146. </a>
  147. )}
  148. </div>
  149. <div className="navbar-buttons navbar-buttons--tv">
  150. <button className="btn navbar-button navbar-button--tv" onClick={this.onToggleTVMode} title="Cycle view mode">
  151. <i className="fa fa-desktop" />
  152. </button>
  153. </div>
  154. {
  155. // <gf-time-picker class="gf-timepicker-nav" dashboard="ctrl.dashboard" ng-if="!ctrl.dashboard.timepicker.hidden"></gf-time-picker>
  156. }
  157. {(isFullscreen || editview) && (
  158. <div className="navbar-buttons navbar-buttons--close">
  159. <button
  160. className="btn navbar-button navbar-button--primary"
  161. onClick={this.onClose}
  162. title="Back to dashboard"
  163. >
  164. <i className="fa fa-reply" />
  165. </button>
  166. </div>
  167. )}
  168. </div>
  169. );
  170. }
  171. }
  172. const mapStateToProps = () => ({});
  173. const mapDispatchToProps = {
  174. updateLocation,
  175. };
  176. export default connect(mapStateToProps, mapDispatchToProps)(DashNav);