Page.tsx 1.8 KB

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