mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
95 lines
2.9 KiB
TypeScript
95 lines
2.9 KiB
TypeScript
// 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} />;
|
|
}
|
|
};
|
|
};
|