mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* CommandPalette: Remove topnav command palette feature flag * Restore search shortcuts if topnav isnt enabled * fix unused imports
110 lines
3.1 KiB
TypeScript
110 lines
3.1 KiB
TypeScript
import { css, cx } from '@emotion/css';
|
|
import React, { PropsWithChildren } from 'react';
|
|
|
|
import { GrafanaTheme2 } from '@grafana/data';
|
|
import { config } from '@grafana/runtime';
|
|
import { useStyles2 } from '@grafana/ui';
|
|
import { useGrafana } from 'app/core/context/GrafanaContext';
|
|
import { CommandPalette } from 'app/features/commandPalette/CommandPalette';
|
|
import { SearchWrapper } from 'app/features/search';
|
|
import { KioskMode } from 'app/types';
|
|
|
|
import { MegaMenu } from '../MegaMenu/MegaMenu';
|
|
import { NavBar } from '../NavBar/NavBar';
|
|
|
|
import { NavToolbar } from './NavToolbar';
|
|
import { TopSearchBar } from './TopSearchBar';
|
|
import { TOP_BAR_LEVEL_HEIGHT } from './types';
|
|
|
|
export interface Props extends PropsWithChildren<{}> {}
|
|
|
|
export function AppChrome({ children }: Props) {
|
|
const styles = useStyles2(getStyles);
|
|
const { chrome } = useGrafana();
|
|
const state = chrome.useState();
|
|
|
|
if (!config.featureToggles.topnav) {
|
|
return (
|
|
<>
|
|
{!state.chromeless && (
|
|
<>
|
|
<NavBar />
|
|
<SearchWrapper />
|
|
<CommandPalette />
|
|
</>
|
|
)}
|
|
<main className="main-view">{children}</main>
|
|
</>
|
|
);
|
|
}
|
|
|
|
const searchBarHidden = state.searchBarHidden || state.kioskMode === KioskMode.TV;
|
|
|
|
const contentClass = cx({
|
|
[styles.content]: true,
|
|
[styles.contentNoSearchBar]: searchBarHidden,
|
|
[styles.contentChromeless]: state.chromeless,
|
|
});
|
|
|
|
// Chromeless routes are without topNav, mega menu, search & command palette
|
|
if (state.chromeless) {
|
|
return (
|
|
<main className="main-view">
|
|
<div className={contentClass}>{children}</div>
|
|
</main>
|
|
);
|
|
}
|
|
|
|
return (
|
|
<main className="main-view">
|
|
<div className={cx(styles.topNav)}>
|
|
{!searchBarHidden && <TopSearchBar />}
|
|
<NavToolbar
|
|
searchBarHidden={searchBarHidden}
|
|
sectionNav={state.sectionNav}
|
|
pageNav={state.pageNav}
|
|
actions={state.actions}
|
|
onToggleSearchBar={chrome.onToggleSearchBar}
|
|
onToggleMegaMenu={chrome.onToggleMegaMenu}
|
|
onToggleKioskMode={chrome.onToggleKioskMode}
|
|
/>
|
|
</div>
|
|
<div className={contentClass}>{children}</div>
|
|
<MegaMenu searchBarHidden={searchBarHidden} onClose={() => chrome.setMegaMenu(false)} />
|
|
<CommandPalette />
|
|
</main>
|
|
);
|
|
}
|
|
|
|
const getStyles = (theme: GrafanaTheme2) => {
|
|
const shadow = theme.isDark
|
|
? `0 0.6px 1.5px rgb(0 0 0), 0 2px 4px rgb(0 0 0 / 40%), 0 5px 10px rgb(0 0 0 / 23%)`
|
|
: '0 0.6px 1.5px rgb(0 0 0 / 8%), 0 2px 4px rgb(0 0 0 / 6%), 0 5px 10px rgb(0 0 0 / 5%)';
|
|
|
|
return {
|
|
content: css({
|
|
display: 'flex',
|
|
flexDirection: 'column',
|
|
paddingTop: TOP_BAR_LEVEL_HEIGHT * 2,
|
|
flexGrow: 1,
|
|
height: '100%',
|
|
}),
|
|
contentNoSearchBar: css({
|
|
paddingTop: TOP_BAR_LEVEL_HEIGHT,
|
|
}),
|
|
contentChromeless: css({
|
|
paddingTop: 0,
|
|
}),
|
|
topNav: css({
|
|
display: 'flex',
|
|
position: 'fixed',
|
|
zIndex: theme.zIndex.navbarFixed,
|
|
left: 0,
|
|
right: 0,
|
|
boxShadow: shadow,
|
|
background: theme.colors.background.primary,
|
|
flexDirection: 'column',
|
|
}),
|
|
};
|
|
};
|