Page.tsx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. import { isEqual } from 'lodash';
  12. interface Props {
  13. children: JSX.Element[] | JSX.Element;
  14. navModel: NavModel;
  15. }
  16. class Page extends Component<Props> {
  17. static Header = PageHeader;
  18. static Contents = PageContents;
  19. componentDidMount() {
  20. this.updateTitle();
  21. }
  22. componentDidUpdate(prevProps: Props) {
  23. if (!isEqual(prevProps.navModel, this.props.navModel)) {
  24. this.updateTitle();
  25. }
  26. }
  27. updateTitle = () => {
  28. const title = this.getPageTitle;
  29. document.title = title ? title + ' - Grafana' : 'Grafana';
  30. };
  31. get getPageTitle() {
  32. const { navModel } = this.props;
  33. if (navModel) {
  34. return getTitleFromNavModel(navModel) || undefined;
  35. }
  36. return undefined;
  37. }
  38. render() {
  39. const { navModel } = this.props;
  40. const { buildInfo } = config;
  41. return (
  42. <div className="page-scrollbar-wrapper">
  43. <CustomScrollbar autoHeightMin={'100%'}>
  44. <div className="page-scrollbar-content">
  45. <PageHeader model={navModel} />
  46. {this.props.children}
  47. <Footer
  48. appName="Grafana"
  49. buildCommit={buildInfo.commit}
  50. buildVersion={buildInfo.version}
  51. newGrafanaVersion={buildInfo.latestVersion}
  52. newGrafanaVersionExists={buildInfo.hasUpdate}
  53. />
  54. </div>
  55. </CustomScrollbar>
  56. </div>
  57. );
  58. }
  59. }
  60. export default Page;