import React from 'react'; // @ts-ignore import Drop from 'tether-drop'; import { locationSearchToObject, navigationLogger, reportPageview } from '@grafana/runtime'; import { keybindingSrv } from '../services/keybindingSrv'; import { GrafanaRouteComponentProps } from './types'; export interface Props extends Omit {} export class GrafanaRoute extends React.Component { componentDidMount() { this.updateBodyClassNames(); this.cleanupDOM(); // unbinds all and re-bind global keybindins keybindingSrv.reset(); keybindingSrv.initGlobals(); reportPageview(); navigationLogger('GrafanaRoute', false, 'Mounted', this.props.match); } componentDidUpdate(prevProps: Props) { this.cleanupDOM(); reportPageview(); navigationLogger('GrafanaRoute', false, 'Updated', this.props, prevProps); } componentWillUnmount() { this.updateBodyClassNames(true); navigationLogger('GrafanaRoute', false, 'Unmounted', this.props.route); } getPageClasses() { return this.props.route.pageClass ? this.props.route.pageClass.split(' ') : []; } updateBodyClassNames(clear = false) { for (const cls of this.getPageClasses()) { if (clear) { document.body.classList.remove(cls); } else { document.body.classList.add(cls); } } } cleanupDOM() { document.body.classList.remove('sidemenu-open--xs'); // cleanup tooltips const tooltipById = document.getElementById('tooltip'); tooltipById?.parentElement?.removeChild(tooltipById); const tooltipsByClass = document.querySelectorAll('.tooltip'); for (let i = 0; i < tooltipsByClass.length; i++) { const tooltip = tooltipsByClass[i]; tooltip.parentElement?.removeChild(tooltip); } // cleanup tether-drop for (const drop of Drop.drops) { drop.destroy(); } } render() { const { props } = this; navigationLogger('GrafanaRoute', false, 'Rendered', props.route); const RouteComponent = props.route.component; return ; } }