12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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<GrafanaRouteComponentProps, 'queryParams'> {}
- export class GrafanaRoute extends React.Component<Props> {
- 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 <RouteComponent {...props} queryParams={locationSearchToObject(props.location.search)} />;
- }
- }
|