|
|
|
|
@ -1,10 +1,9 @@ |
|
|
|
|
// Libraries
|
|
|
|
|
import { css, cx } from '@emotion/css'; |
|
|
|
|
import React, { useEffect, useState } from 'react'; |
|
|
|
|
import { useLocalStorage } from 'react-use'; |
|
|
|
|
import React, { useEffect } from 'react'; |
|
|
|
|
|
|
|
|
|
import { GrafanaTheme2, PageLayoutType } from '@grafana/data'; |
|
|
|
|
import { CustomScrollbar, useStyles2, useTheme2 } from '@grafana/ui'; |
|
|
|
|
import { CustomScrollbar, useStyles2 } from '@grafana/ui'; |
|
|
|
|
import { useGrafana } from 'app/core/context/GrafanaContext'; |
|
|
|
|
|
|
|
|
|
import { Footer } from '../Footer/Footer'; |
|
|
|
|
@ -16,7 +15,6 @@ import { PageContents } from './PageContents'; |
|
|
|
|
import { PageHeader } from './PageHeader'; |
|
|
|
|
import { PageTabs } from './PageTabs'; |
|
|
|
|
import { SectionNav } from './SectionNav'; |
|
|
|
|
import { SectionNavToggle } from './SectionNavToggle'; |
|
|
|
|
|
|
|
|
|
export const Page: PageType = ({ |
|
|
|
|
navId, |
|
|
|
|
@ -31,29 +29,14 @@ export const Page: PageType = ({ |
|
|
|
|
scrollRef, |
|
|
|
|
...otherProps |
|
|
|
|
}) => { |
|
|
|
|
const theme = useTheme2(); |
|
|
|
|
const styles = useStyles2(getStyles); |
|
|
|
|
const navModel = usePageNav(navId, oldNavProp); |
|
|
|
|
const { chrome } = useGrafana(); |
|
|
|
|
|
|
|
|
|
const isSmallScreen = window.matchMedia(`(max-width: ${theme.breakpoints.values.lg}px)`).matches; |
|
|
|
|
const [navExpandedPreference, setNavExpandedPreference] = useLocalStorage<boolean>( |
|
|
|
|
'grafana.sectionNav.expanded', |
|
|
|
|
!isSmallScreen |
|
|
|
|
); |
|
|
|
|
const [isNavExpanded, setNavExpanded] = useState(!isSmallScreen && navExpandedPreference); |
|
|
|
|
|
|
|
|
|
usePageTitle(navModel, pageNav); |
|
|
|
|
|
|
|
|
|
const pageHeaderNav = pageNav ?? navModel?.node; |
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
|
const mediaQuery = window.matchMedia(`(max-width: ${theme.breakpoints.values.lg}px)`); |
|
|
|
|
const onMediaQueryChange = (e: MediaQueryListEvent) => setNavExpanded(e.matches ? false : navExpandedPreference); |
|
|
|
|
mediaQuery.addEventListener('change', onMediaQueryChange); |
|
|
|
|
return () => mediaQuery.removeEventListener('change', onMediaQueryChange); |
|
|
|
|
}, [navExpandedPreference, theme.breakpoints.values.lg]); |
|
|
|
|
|
|
|
|
|
useEffect(() => { |
|
|
|
|
if (navModel) { |
|
|
|
|
chrome.update({ |
|
|
|
|
@ -63,25 +46,11 @@ export const Page: PageType = ({ |
|
|
|
|
} |
|
|
|
|
}, [navModel, pageNav, chrome]); |
|
|
|
|
|
|
|
|
|
const onToggleSectionNav = () => { |
|
|
|
|
setNavExpandedPreference(!isNavExpanded); |
|
|
|
|
setNavExpanded(!isNavExpanded); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
return ( |
|
|
|
|
<div className={cx(styles.wrapper, className)} {...otherProps}> |
|
|
|
|
{layout === PageLayoutType.Standard && ( |
|
|
|
|
<div className={styles.panes}> |
|
|
|
|
{navModel && ( |
|
|
|
|
<> |
|
|
|
|
<SectionNav model={navModel} isExpanded={Boolean(isNavExpanded)} /> |
|
|
|
|
<SectionNavToggle |
|
|
|
|
className={styles.collapseIcon} |
|
|
|
|
isExpanded={Boolean(isNavExpanded)} |
|
|
|
|
onClick={onToggleSectionNav} |
|
|
|
|
/> |
|
|
|
|
</> |
|
|
|
|
)} |
|
|
|
|
{navModel && <SectionNav model={navModel} />} |
|
|
|
|
<div className={styles.pageContainer}> |
|
|
|
|
<CustomScrollbar autoHeightMin={'100%'} scrollTop={scrollTop} scrollRefCallback={scrollRef}> |
|
|
|
|
<div className={styles.pageInner}> |
|
|
|
|
@ -125,18 +94,6 @@ const getStyles = (theme: GrafanaTheme2) => { |
|
|
|
|
: '0 0.6px 1.5px -1px rgb(0 0 0 / 8%),0 2px 4px rgb(0 0 0 / 6%),0 5px 10px -1px rgb(0 0 0 / 5%)'; |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
collapseIcon: css({ |
|
|
|
|
border: `1px solid ${theme.colors.border.weak}`, |
|
|
|
|
transform: 'translateX(50%)', |
|
|
|
|
top: theme.spacing(8), |
|
|
|
|
right: theme.spacing(-1), |
|
|
|
|
|
|
|
|
|
[theme.breakpoints.down('md')]: { |
|
|
|
|
left: '50%', |
|
|
|
|
transform: 'translate(-50%, 50%) rotate(90deg)', |
|
|
|
|
top: theme.spacing(2), |
|
|
|
|
}, |
|
|
|
|
}), |
|
|
|
|
wrapper: css({ |
|
|
|
|
label: 'page-wrapper', |
|
|
|
|
height: '100%', |
|
|
|
|
|