|
|
@@ -0,0 +1,94 @@
|
|
|
+// Libraries
|
|
|
+import React, { PureComponent } from 'react';
|
|
|
+
|
|
|
+// Services
|
|
|
+import { getTimeSrv } from 'app/features/dashboard/time_srv';
|
|
|
+import { contextSrv } from 'app/core/services/context_srv';
|
|
|
+import { getDatasourceSrv } from 'app/features/plugins/datasource_srv';
|
|
|
+import { store } from 'app/store/configureStore';
|
|
|
+
|
|
|
+// Components
|
|
|
+import { PanelHeaderMenu } from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenu';
|
|
|
+import config from 'app/core/config';
|
|
|
+import { getExploreUrl } from 'app/core/utils/explore';
|
|
|
+import { updateLocation } from 'app/core/actions';
|
|
|
+
|
|
|
+// Types
|
|
|
+import { PanelModel } from 'app/features/dashboard/panel_model';
|
|
|
+import { PanelHeaderMenuProps } from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenu';
|
|
|
+import {
|
|
|
+ PanelHeaderMenuItemProps,
|
|
|
+ PanelHeaderMenuItemTypes,
|
|
|
+} from 'app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuItem';
|
|
|
+
|
|
|
+interface LocalState {
|
|
|
+ datasource: any;
|
|
|
+}
|
|
|
+
|
|
|
+export const withMenuOptions = (WrappedPanelHeaderMenu: typeof PanelHeaderMenu, panel: PanelModel) => {
|
|
|
+ return class extends PureComponent<PanelHeaderMenuProps, LocalState> {
|
|
|
+ private datasourceSrv = getDatasourceSrv();
|
|
|
+ private timeSrv = getTimeSrv();
|
|
|
+
|
|
|
+ constructor(props) {
|
|
|
+ super(props);
|
|
|
+ this.state = {
|
|
|
+ datasource: undefined,
|
|
|
+ };
|
|
|
+ }
|
|
|
+
|
|
|
+ componentDidMount() {
|
|
|
+ const dsPromise = getDatasourceSrv().get(panel.datasource);
|
|
|
+ dsPromise.then((datasource: any) => {
|
|
|
+ this.setState(() => ({ datasource }));
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ onExploreClick = async () => {
|
|
|
+ const { datasource } = this.state;
|
|
|
+ const url = await getExploreUrl(panel, panel.targets, datasource, this.datasourceSrv, this.timeSrv);
|
|
|
+ if (url) {
|
|
|
+ store.dispatch(updateLocation({ path: url }));
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ getAdditionalMenuItems = () => {
|
|
|
+ const { datasource } = this.state;
|
|
|
+ const items = [];
|
|
|
+ if (
|
|
|
+ config.exploreEnabled &&
|
|
|
+ contextSrv.isEditor &&
|
|
|
+ datasource &&
|
|
|
+ (datasource.meta.explore || datasource.meta.id === 'mixed')
|
|
|
+ ) {
|
|
|
+ items.push({
|
|
|
+ type: PanelHeaderMenuItemTypes.Link,
|
|
|
+ text: 'Explore',
|
|
|
+ handleClick: this.onExploreClick,
|
|
|
+ iconClassName: 'fa fa-fw fa-rocket',
|
|
|
+ shortcut: 'x',
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return items;
|
|
|
+ };
|
|
|
+
|
|
|
+ getAdditionalSubMenuItems = () => {
|
|
|
+ return [
|
|
|
+ {
|
|
|
+ type: PanelHeaderMenuItemTypes.Link,
|
|
|
+ text: 'Hello Sub Menu',
|
|
|
+ handleClick: () => {
|
|
|
+ alert('Hello world from HOC!');
|
|
|
+ },
|
|
|
+ shortcut: 's h w',
|
|
|
+ },
|
|
|
+ ] as PanelHeaderMenuItemProps[];
|
|
|
+ };
|
|
|
+
|
|
|
+ render() {
|
|
|
+ const menu: PanelHeaderMenuItemProps[] = this.getAdditionalMenuItems();
|
|
|
+ const subMenu: PanelHeaderMenuItemProps[] = this.getAdditionalSubMenuItems();
|
|
|
+ return <WrappedPanelHeaderMenu {...this.props} additionalMenuItems={menu} additionalSubMenuItems={subMenu} />;
|
|
|
+ }
|
|
|
+ };
|
|
|
+};
|