Navigation: Fix scope dashboards selector with bodyScrolling (#91892)
* almost working * add hook to get scopesDashboardsScene state * check whether it's enabled when considering opened state * add height to container
This commit is contained in:
@@ -9,12 +9,12 @@ import { useGrafana } from 'app/core/context/GrafanaContext';
|
|||||||
import { useMediaQueryChange } from 'app/core/hooks/useMediaQueryChange';
|
import { useMediaQueryChange } from 'app/core/hooks/useMediaQueryChange';
|
||||||
import store from 'app/core/store';
|
import store from 'app/core/store';
|
||||||
import { CommandPalette } from 'app/features/commandPalette/CommandPalette';
|
import { CommandPalette } from 'app/features/commandPalette/CommandPalette';
|
||||||
import { ScopesDashboards } from 'app/features/scopes';
|
import { ScopesDashboards, useScopesDashboardsState } from 'app/features/scopes';
|
||||||
import { KioskMode } from 'app/types';
|
import { KioskMode } from 'app/types';
|
||||||
|
|
||||||
import { AppChromeMenu } from './AppChromeMenu';
|
import { AppChromeMenu } from './AppChromeMenu';
|
||||||
import { DOCKED_LOCAL_STORAGE_KEY, DOCKED_MENU_OPEN_LOCAL_STORAGE_KEY } from './AppChromeService';
|
import { DOCKED_LOCAL_STORAGE_KEY, DOCKED_MENU_OPEN_LOCAL_STORAGE_KEY } from './AppChromeService';
|
||||||
import { MegaMenu } from './MegaMenu/MegaMenu';
|
import { MegaMenu, MENU_WIDTH } from './MegaMenu/MegaMenu';
|
||||||
import { NavToolbar } from './NavToolbar/NavToolbar';
|
import { NavToolbar } from './NavToolbar/NavToolbar';
|
||||||
import { ReturnToPrevious } from './ReturnToPrevious/ReturnToPrevious';
|
import { ReturnToPrevious } from './ReturnToPrevious/ReturnToPrevious';
|
||||||
import { TopSearchBar } from './TopBar/TopSearchBar';
|
import { TopSearchBar } from './TopBar/TopSearchBar';
|
||||||
@@ -32,6 +32,9 @@ export function AppChrome({ children }: Props) {
|
|||||||
const dockedMenuBreakpoint = theme.breakpoints.values.xl;
|
const dockedMenuBreakpoint = theme.breakpoints.values.xl;
|
||||||
const dockedMenuLocalStorageState = store.getBool(DOCKED_LOCAL_STORAGE_KEY, true);
|
const dockedMenuLocalStorageState = store.getBool(DOCKED_LOCAL_STORAGE_KEY, true);
|
||||||
const menuDockedAndOpen = !state.chromeless && state.megaMenuDocked && state.megaMenuOpen;
|
const menuDockedAndOpen = !state.chromeless && state.megaMenuDocked && state.megaMenuOpen;
|
||||||
|
const scopesDashboardsState = useScopesDashboardsState();
|
||||||
|
const isScopesDashboardsOpen = Boolean(scopesDashboardsState?.isEnabled && scopesDashboardsState?.isPanelOpened);
|
||||||
|
|
||||||
useMediaQueryChange({
|
useMediaQueryChange({
|
||||||
breakpoint: dockedMenuBreakpoint,
|
breakpoint: dockedMenuBreakpoint,
|
||||||
onChange: (e) => {
|
onChange: (e) => {
|
||||||
@@ -107,10 +110,21 @@ export function AppChrome({ children }: Props) {
|
|||||||
{menuDockedAndOpen && (
|
{menuDockedAndOpen && (
|
||||||
<MegaMenu className={styles.dockedMegaMenu} onClose={() => chrome.setMegaMenuOpen(false)} />
|
<MegaMenu className={styles.dockedMegaMenu} onClose={() => chrome.setMegaMenuOpen(false)} />
|
||||||
)}
|
)}
|
||||||
{!state.chromeless && <ScopesDashboards />}
|
{!state.chromeless && (
|
||||||
|
<div
|
||||||
|
className={cx(styles.scopesDashboardsContainer, {
|
||||||
|
[styles.scopesDashboardsContainerDocked]: menuDockedAndOpen,
|
||||||
|
})}
|
||||||
|
>
|
||||||
|
<ScopesDashboards />
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
<main
|
<main
|
||||||
className={cx(styles.pageContainer, {
|
className={cx(styles.pageContainer, {
|
||||||
[styles.pageContainerMenuDocked]: config.featureToggles.bodyScrolling && menuDockedAndOpen,
|
[styles.pageContainerMenuDocked]:
|
||||||
|
config.featureToggles.bodyScrolling && (menuDockedAndOpen || isScopesDashboardsOpen),
|
||||||
|
[styles.pageContainerMenuDockedScopes]:
|
||||||
|
config.featureToggles.bodyScrolling && menuDockedAndOpen && isScopesDashboardsOpen,
|
||||||
})}
|
})}
|
||||||
id="pageContent"
|
id="pageContent"
|
||||||
>
|
>
|
||||||
@@ -152,6 +166,17 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
|
|||||||
display: 'block',
|
display: 'block',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
config.featureToggles.bodyScrolling
|
||||||
|
? {
|
||||||
|
position: 'fixed',
|
||||||
|
height: `calc(100% - ${searchBarHidden ? TOP_BAR_LEVEL_HEIGHT : TOP_BAR_LEVEL_HEIGHT * 2}px)`,
|
||||||
|
zIndex: 2,
|
||||||
|
}
|
||||||
|
: {
|
||||||
|
zIndex: theme.zIndex.navbarFixed,
|
||||||
|
}
|
||||||
|
),
|
||||||
|
scopesDashboardsContainer: css(
|
||||||
config.featureToggles.bodyScrolling
|
config.featureToggles.bodyScrolling
|
||||||
? {
|
? {
|
||||||
position: 'fixed',
|
position: 'fixed',
|
||||||
@@ -162,6 +187,9 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
|
|||||||
zIndex: theme.zIndex.navbarFixed,
|
zIndex: theme.zIndex.navbarFixed,
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
|
scopesDashboardsContainerDocked: css({
|
||||||
|
left: MENU_WIDTH,
|
||||||
|
}),
|
||||||
topNav: css({
|
topNav: css({
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
position: 'fixed',
|
position: 'fixed',
|
||||||
@@ -188,7 +216,10 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
|
|||||||
}
|
}
|
||||||
),
|
),
|
||||||
pageContainerMenuDocked: css({
|
pageContainerMenuDocked: css({
|
||||||
paddingLeft: '300px',
|
paddingLeft: MENU_WIDTH,
|
||||||
|
}),
|
||||||
|
pageContainerMenuDockedScopes: css({
|
||||||
|
paddingLeft: `calc(${MENU_WIDTH} * 2)`,
|
||||||
}),
|
}),
|
||||||
pageContainer: css(
|
pageContainer: css(
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ export { ScopesDashboards } from './ScopesDashboards';
|
|||||||
/* eslint-disable */
|
/* eslint-disable */
|
||||||
export { ScopesFacade } from './ScopesFacadeScene';
|
export { ScopesFacade } from './ScopesFacadeScene';
|
||||||
export { ScopesSelector } from './ScopesSelector';
|
export { ScopesSelector } from './ScopesSelector';
|
||||||
|
export { useScopesDashboardsState } from './useScopesDashboardsState';
|
||||||
export {
|
export {
|
||||||
disableScopes,
|
disableScopes,
|
||||||
enableScopes,
|
enableScopes,
|
||||||
|
|||||||
@@ -231,6 +231,7 @@ const getStyles = (theme: GrafanaTheme2) => {
|
|||||||
borderRight: `1px solid ${theme.colors.border.weak}`,
|
borderRight: `1px solid ${theme.colors.border.weak}`,
|
||||||
display: 'flex',
|
display: 'flex',
|
||||||
flexDirection: 'column',
|
flexDirection: 'column',
|
||||||
|
height: '100%',
|
||||||
gap: theme.spacing(1),
|
gap: theme.spacing(1),
|
||||||
padding: theme.spacing(2),
|
padding: theme.spacing(2),
|
||||||
width: theme.spacing(37.5),
|
width: theme.spacing(37.5),
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import { scopesDashboardsScene } from './instance';
|
||||||
|
|
||||||
|
export const useScopesDashboardsState = () => {
|
||||||
|
return scopesDashboardsScene?.useState();
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user