Page.tsx 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // Libraries
  2. import React, { Component } from 'react';
  3. import config from 'app/core/config';
  4. import { NavModel } from 'app/types';
  5. import { getTitleFromNavModel } from 'app/core/selectors/navModel';
  6. // Components
  7. import PageHeader from '../PageHeader/PageHeader';
  8. import Footer from '../Footer/Footer';
  9. import PageContents from './PageContents';
  10. import { CustomScrollbar } from '@grafana/ui';
  11. interface Props {
  12. title?: string;
  13. children: JSX.Element[] | JSX.Element;
  14. navModel: NavModel;
  15. }
  16. class Page extends Component<Props> {
  17. private bodyClass = 'is-react';
  18. private body = document.body;
  19. static Header = PageHeader;
  20. static Contents = PageContents;
  21. componentDidMount() {
  22. this.body.classList.add(this.bodyClass);
  23. this.updateTitle();
  24. }
  25. componentDidUpdate(prevProps: Props) {
  26. if (prevProps.title !== this.props.title) {
  27. this.updateTitle();
  28. }
  29. }
  30. componentWillUnmount() {
  31. this.body.classList.remove(this.bodyClass);
  32. }
  33. updateTitle = () => {
  34. const title = this.getPageTitle;
  35. document.title = title ? title + ' - Grafana' : 'Grafana';
  36. }
  37. get getPageTitle () {
  38. const { navModel } = this.props;
  39. if (navModel) {
  40. return getTitleFromNavModel(navModel) || undefined;
  41. }
  42. return undefined;
  43. }
  44. render() {
  45. const { navModel } = this.props;
  46. const { buildInfo } = config;
  47. return (
  48. <div className="page-scrollbar-wrapper">
  49. <CustomScrollbar autoHeightMin={'100%'}>
  50. <div className="page-scrollbar-content">
  51. <PageHeader model={navModel} />
  52. {this.props.children}
  53. <Footer
  54. appName="Grafana"
  55. buildCommit={buildInfo.commit}
  56. buildVersion={buildInfo.version}
  57. newGrafanaVersion={buildInfo.latestVersion}
  58. newGrafanaVersionExists={buildInfo.hasUpdate} />
  59. </div>
  60. </CustomScrollbar>
  61. </div>
  62. );
  63. }
  64. }
  65. export default Page;