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:
Ashley Harrison
2024-08-15 09:58:26 +01:00
committed by GitHub
parent d6ce6aaf44
commit 2ac247be88
4 changed files with 43 additions and 5 deletions
@@ -9,12 +9,12 @@ import { useGrafana } from 'app/core/context/GrafanaContext';
import { useMediaQueryChange } from 'app/core/hooks/useMediaQueryChange';
import store from 'app/core/store';
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 { AppChromeMenu } from './AppChromeMenu';
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 { ReturnToPrevious } from './ReturnToPrevious/ReturnToPrevious';
import { TopSearchBar } from './TopBar/TopSearchBar';
@@ -32,6 +32,9 @@ export function AppChrome({ children }: Props) {
const dockedMenuBreakpoint = theme.breakpoints.values.xl;
const dockedMenuLocalStorageState = store.getBool(DOCKED_LOCAL_STORAGE_KEY, true);
const menuDockedAndOpen = !state.chromeless && state.megaMenuDocked && state.megaMenuOpen;
const scopesDashboardsState = useScopesDashboardsState();
const isScopesDashboardsOpen = Boolean(scopesDashboardsState?.isEnabled && scopesDashboardsState?.isPanelOpened);
useMediaQueryChange({
breakpoint: dockedMenuBreakpoint,
onChange: (e) => {
@@ -107,10 +110,21 @@ export function AppChrome({ children }: Props) {
{menuDockedAndOpen && (
<MegaMenu className={styles.dockedMegaMenu} onClose={() => chrome.setMegaMenuOpen(false)} />
)}
{!state.chromeless && <ScopesDashboards />}
{!state.chromeless && (
<div
className={cx(styles.scopesDashboardsContainer, {
[styles.scopesDashboardsContainerDocked]: menuDockedAndOpen,
})}
>
<ScopesDashboards />
</div>
)}
<main
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"
>
@@ -152,6 +166,17 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
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
? {
position: 'fixed',
@@ -162,6 +187,9 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
zIndex: theme.zIndex.navbarFixed,
}
),
scopesDashboardsContainerDocked: css({
left: MENU_WIDTH,
}),
topNav: css({
display: 'flex',
position: 'fixed',
@@ -188,7 +216,10 @@ const getStyles = (theme: GrafanaTheme2, searchBarHidden: boolean) => {
}
),
pageContainerMenuDocked: css({
paddingLeft: '300px',
paddingLeft: MENU_WIDTH,
}),
pageContainerMenuDockedScopes: css({
paddingLeft: `calc(${MENU_WIDTH} * 2)`,
}),
pageContainer: css(
{
+1
View File
@@ -3,6 +3,7 @@ export { ScopesDashboards } from './ScopesDashboards';
/* eslint-disable */
export { ScopesFacade } from './ScopesFacadeScene';
export { ScopesSelector } from './ScopesSelector';
export { useScopesDashboardsState } from './useScopesDashboardsState';
export {
disableScopes,
enableScopes,
@@ -231,6 +231,7 @@ const getStyles = (theme: GrafanaTheme2) => {
borderRight: `1px solid ${theme.colors.border.weak}`,
display: 'flex',
flexDirection: 'column',
height: '100%',
gap: theme.spacing(1),
padding: theme.spacing(2),
width: theme.spacing(37.5),
@@ -0,0 +1,5 @@
import { scopesDashboardsScene } from './instance';
export const useScopesDashboardsState = () => {
return scopesDashboardsScene?.useState();
};