PanelHeaderMenu.tsx 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import React, { PureComponent } from 'react';
  2. import { DashboardModel } from 'app/features/dashboard/dashboard_model';
  3. import { PanelHeaderMenuItem, PanelHeaderMenuItemTypes } from './PanelHeaderMenuItem';
  4. import { store } from 'app/store/configureStore';
  5. import { updateLocation } from 'app/core/actions';
  6. import { removePanel, duplicatePanel, copyPanel, editPanelJson, sharePanel } from 'app/features/dashboard/utils/panel';
  7. export interface PanelHeaderMenuProps {
  8. panelId: number;
  9. dashboard: DashboardModel;
  10. }
  11. export class PanelHeaderMenu extends PureComponent<PanelHeaderMenuProps, any> {
  12. getPanel = () => {
  13. // Pass in panel as prop instead?
  14. const { panelId, dashboard } = this.props;
  15. const panelInfo = dashboard.getPanelInfoById(panelId);
  16. return panelInfo.panel;
  17. };
  18. onEditPanel = () => {
  19. store.dispatch(
  20. updateLocation({
  21. query: {
  22. panelId: this.props.panelId,
  23. edit: true,
  24. fullscreen: true,
  25. },
  26. })
  27. );
  28. };
  29. onViewPanel = () => {
  30. store.dispatch(
  31. updateLocation({
  32. query: {
  33. panelId: this.props.panelId,
  34. edit: false,
  35. fullscreen: true,
  36. },
  37. })
  38. );
  39. };
  40. onRemovePanel = () => {
  41. const { dashboard } = this.props;
  42. const panel = this.getPanel();
  43. removePanel(dashboard, panel, true);
  44. };
  45. onSharePanel = () => {
  46. const { dashboard } = this.props;
  47. const panel = this.getPanel();
  48. sharePanel(dashboard, panel);
  49. };
  50. onDuplicatePanel = () => {
  51. const { dashboard } = this.props;
  52. const panel = this.getPanel();
  53. duplicatePanel(dashboard, panel);
  54. };
  55. onCopyPanel = () => {
  56. const panel = this.getPanel();
  57. copyPanel(panel);
  58. };
  59. onEditPanelJson = () => {
  60. const { dashboard } = this.props;
  61. const panel = this.getPanel();
  62. editPanelJson(dashboard, panel);
  63. };
  64. render() {
  65. return (
  66. <div className="panel-menu-container dropdown">
  67. <ul className="dropdown-menu dropdown-menu--menu panel-menu" role="menu">
  68. <PanelHeaderMenuItem
  69. type={PanelHeaderMenuItemTypes.Link}
  70. text="View"
  71. iconClassName="fa fa-fw fa-eye"
  72. handleClick={this.onViewPanel}
  73. shortcut="v"
  74. />
  75. <PanelHeaderMenuItem
  76. type={PanelHeaderMenuItemTypes.Link}
  77. text="Edit"
  78. iconClassName="fa fa-fw fa-edit"
  79. handleClick={this.onEditPanel}
  80. shortcut="e"
  81. />
  82. <PanelHeaderMenuItem
  83. type={PanelHeaderMenuItemTypes.Link}
  84. text="Share"
  85. iconClassName="fa fa-fw fa-share"
  86. handleClick={this.onSharePanel}
  87. shortcut="p s"
  88. />
  89. <PanelHeaderMenuItem
  90. type={PanelHeaderMenuItemTypes.SubMenu}
  91. text="More ..."
  92. iconClassName="fa fa-fw fa-cube"
  93. handleClick={null}
  94. >
  95. <ul className="dropdown-menu dropdown-menu--menu panel-menu">
  96. <PanelHeaderMenuItem
  97. type={PanelHeaderMenuItemTypes.Link}
  98. text="Duplicate"
  99. iconClassName=""
  100. handleClick={this.onDuplicatePanel}
  101. shortcut="p d"
  102. />
  103. <PanelHeaderMenuItem type={PanelHeaderMenuItemTypes.Link} text="Copy" handleClick={this.onCopyPanel} />
  104. <PanelHeaderMenuItem
  105. type={PanelHeaderMenuItemTypes.Link}
  106. text="Panel JSON"
  107. handleClick={this.onEditPanelJson}
  108. />
  109. <PanelHeaderMenuItem type={PanelHeaderMenuItemTypes.Link} text="Export CSV" handleClick={() => {}} />
  110. <PanelHeaderMenuItem
  111. type={PanelHeaderMenuItemTypes.Link}
  112. text="Toggle legend"
  113. handleClick={() => {}}
  114. shortcut="p l"
  115. />
  116. </ul>
  117. </PanelHeaderMenuItem>
  118. <PanelHeaderMenuItem type={PanelHeaderMenuItemTypes.Divider} />
  119. <PanelHeaderMenuItem
  120. type={PanelHeaderMenuItemTypes.Link}
  121. text="Remove"
  122. iconClassName="fa fa-fw fa-trash"
  123. handleClick={this.onRemovePanel}
  124. shortcut="p r"
  125. />
  126. </ul>
  127. </div>
  128. );
  129. }
  130. }