withMenuOptions.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Libraries
  2. import React, { PureComponent } from 'react';
  3. // Services
  4. import { getTimeSrv } from 'app/features/dashboard/time_srv';
  5. import { contextSrv } from 'app/core/services/context_srv';
  6. import { getDatasourceSrv } from 'app/features/plugins/datasource_srv';
  7. import { store } from 'app/store/configureStore';
  8. // Components
  9. import { PanelHeaderMenu } from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenu';
  10. import config from 'app/core/config';
  11. import { getExploreUrl } from 'app/core/utils/explore';
  12. import { updateLocation } from 'app/core/actions';
  13. // Types
  14. import { PanelModel } from 'app/features/dashboard/panel_model';
  15. import { PanelHeaderMenuProps } from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenu';
  16. import {
  17. PanelHeaderMenuItemProps,
  18. PanelHeaderMenuItemTypes,
  19. } from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuItem';
  20. interface LocalState {
  21. datasource: any;
  22. }
  23. export const withMenuOptions = (WrappedPanelHeaderMenu: typeof PanelHeaderMenu, panel: PanelModel) => {
  24. return class extends PureComponent<PanelHeaderMenuProps, LocalState> {
  25. private datasourceSrv = getDatasourceSrv();
  26. private timeSrv = getTimeSrv();
  27. constructor(props) {
  28. super(props);
  29. this.state = {
  30. datasource: undefined,
  31. };
  32. }
  33. componentDidMount() {
  34. const dsPromise = getDatasourceSrv().get(panel.datasource);
  35. dsPromise.then((datasource: any) => {
  36. this.setState(() => ({ datasource }));
  37. });
  38. }
  39. onExploreClick = async () => {
  40. const { datasource } = this.state;
  41. const url = await getExploreUrl(panel, panel.targets, datasource, this.datasourceSrv, this.timeSrv);
  42. if (url) {
  43. store.dispatch(updateLocation({ path: url }));
  44. }
  45. };
  46. getAdditionalMenuItems = () => {
  47. const { datasource } = this.state;
  48. const items = [];
  49. if (
  50. config.exploreEnabled &&
  51. contextSrv.isEditor &&
  52. datasource &&
  53. (datasource.meta.explore || datasource.meta.id === 'mixed')
  54. ) {
  55. items.push({
  56. type: PanelHeaderMenuItemTypes.Link,
  57. text: 'Explore',
  58. handleClick: this.onExploreClick,
  59. iconClassName: 'fa fa-fw fa-rocket',
  60. shortcut: 'x',
  61. });
  62. }
  63. return items;
  64. };
  65. getAdditionalSubMenuItems = () => {
  66. return [
  67. {
  68. type: PanelHeaderMenuItemTypes.Link,
  69. text: 'Hello Sub Menu',
  70. handleClick: () => {
  71. alert('Hello world from HOC!');
  72. },
  73. shortcut: 's h w',
  74. },
  75. ] as PanelHeaderMenuItemProps[];
  76. };
  77. render() {
  78. const menu: PanelHeaderMenuItemProps[] = this.getAdditionalMenuItems();
  79. const subMenu: PanelHeaderMenuItemProps[] = this.getAdditionalSubMenuItems();
  80. return <WrappedPanelHeaderMenu {...this.props} additionalMenuItems={menu} additionalSubMenuItems={subMenu} />;
  81. }
  82. };
  83. };