mirror of
https://github.com/grafana/grafana.git
synced 2025-02-12 00:25:46 -06:00
* Load Rich History when the container is opened * Store rich history for each pane separately * Do not update currently opened query history when an item is added It's impossible to figure out if the item should be added or not, because filters are applied in the backend. We don't want to replicate that filtering logic in frontend. One way to make it work could be by refreshing both panes. * Test starring and deleting query history items when both panes are open * Remove e2e dependency on ExploreId * Fix unit test * Assert exact queries * Simplify test * Fix e2e tests * Fix toolbar a11y * Reload the history after an item is added * Fix unit test * Remove references to Explore from generic PageToolbar component * Update test name * Fix test assertion * Add issue item to TODO * Improve test assertion * Simplify test setup
90 lines
3.5 KiB
TypeScript
90 lines
3.5 KiB
TypeScript
import React, { PureComponent } from 'react';
|
|
import { connect, ConnectedProps } from 'react-redux';
|
|
import { ExploreId, ExploreQueryParams } from 'app/types/explore';
|
|
import { ErrorBoundaryAlert } from '@grafana/ui';
|
|
import { lastSavedUrl, resetExploreAction, richHistoryUpdatedAction } from './state/main';
|
|
import { ExplorePaneContainer } from './ExplorePaneContainer';
|
|
import { GrafanaRouteComponentProps } from 'app/core/navigation/types';
|
|
import { Branding } from '../../core/components/Branding/Branding';
|
|
|
|
import { getNavModel } from '../../core/selectors/navModel';
|
|
import { StoreState } from 'app/types';
|
|
import { locationService } from '@grafana/runtime';
|
|
|
|
interface RouteProps extends GrafanaRouteComponentProps<{}, ExploreQueryParams> {}
|
|
interface OwnProps {}
|
|
|
|
const mapStateToProps = (state: StoreState) => {
|
|
return {
|
|
navModel: getNavModel(state.navIndex, 'explore'),
|
|
exploreState: state.explore,
|
|
};
|
|
};
|
|
|
|
const mapDispatchToProps = {
|
|
resetExploreAction,
|
|
richHistoryUpdatedAction,
|
|
};
|
|
|
|
const connector = connect(mapStateToProps, mapDispatchToProps);
|
|
|
|
type Props = OwnProps & RouteProps & ConnectedProps<typeof connector>;
|
|
class WrapperUnconnected extends PureComponent<Props> {
|
|
componentWillUnmount() {
|
|
this.props.resetExploreAction({});
|
|
}
|
|
|
|
componentDidMount() {
|
|
lastSavedUrl.left = undefined;
|
|
lastSavedUrl.right = undefined;
|
|
|
|
// timeSrv (which is used internally) on init reads `from` and `to` param from the URL and updates itself
|
|
// using those value regardless of what is passed to the init method.
|
|
// The updated value is then used by Explore to get the range for each pane.
|
|
// This means that if `from` and `to` parameters are present in the URL,
|
|
// it would be impossible to change the time range in Explore.
|
|
// We are only doing this on mount for 2 reasons:
|
|
// 1: Doing it on update means we'll enter a render loop.
|
|
// 2: when parsing time in Explore (before feeding it to timeSrv) we make sure `from` is before `to` inside
|
|
// each pane state in order to not trigger un URL update from timeSrv.
|
|
const searchParams = locationService.getSearchObject();
|
|
if (searchParams.from || searchParams.to) {
|
|
locationService.partial({ from: undefined, to: undefined }, true);
|
|
}
|
|
}
|
|
|
|
componentDidUpdate(prevProps: Props) {
|
|
const { left, right } = this.props.queryParams;
|
|
const hasSplit = Boolean(left) && Boolean(right);
|
|
const datasourceTitle = hasSplit
|
|
? `${this.props.exploreState.left.datasourceInstance?.name} | ${this.props.exploreState.right?.datasourceInstance?.name}`
|
|
: `${this.props.exploreState.left.datasourceInstance?.name}`;
|
|
const documentTitle = `${this.props.navModel.main.text} - ${datasourceTitle} - ${Branding.AppTitle}`;
|
|
document.title = documentTitle;
|
|
}
|
|
|
|
render() {
|
|
const { left, right } = this.props.queryParams;
|
|
const hasSplit = Boolean(left) && Boolean(right);
|
|
|
|
return (
|
|
<div className="page-scrollbar-wrapper">
|
|
<div className="explore-wrapper">
|
|
<ErrorBoundaryAlert style="page">
|
|
<ExplorePaneContainer split={hasSplit} exploreId={ExploreId.left} urlQuery={left} />
|
|
</ErrorBoundaryAlert>
|
|
{hasSplit && (
|
|
<ErrorBoundaryAlert style="page">
|
|
<ExplorePaneContainer split={hasSplit} exploreId={ExploreId.right} urlQuery={right} />
|
|
</ErrorBoundaryAlert>
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|
|
}
|
|
|
|
const Wrapper = connector(WrapperUnconnected);
|
|
|
|
export default Wrapper;
|