diff --git a/public/app/core/components/AppChrome/TopBar/HelpTopBarButton.tsx b/public/app/core/components/AppChrome/TopBar/HelpTopBarButton.tsx new file mode 100644 index 00000000000..7c6c7439e3d --- /dev/null +++ b/public/app/core/components/AppChrome/TopBar/HelpTopBarButton.tsx @@ -0,0 +1,78 @@ +import { css } from '@emotion/css'; +import { memo } from 'react'; + +import { GrafanaTheme2, NavModelItem } from '@grafana/data'; +import { t } from '@grafana/i18n'; +import { getAppEvents } from '@grafana/runtime'; +import { Dropdown, ToolbarButton, useStyles2 } from '@grafana/ui'; +import { OpenExtensionSidebarEvent } from 'app/types/events'; + +import { + useExtensionSidebarContext, + getComponentIdFromComponentMeta, +} from '../ExtensionSidebar/ExtensionSidebarProvider'; + +import { TopNavBarMenu } from './TopNavBarMenu'; + +interface Props { + isSmallScreen: boolean; + enrichedHelpNode: NavModelItem; +} + +export const HelpTopBarButton = memo(function HelpTopBarButton({ enrichedHelpNode, isSmallScreen }: Props) { + const { setDockedComponentId, dockedComponentId, availableComponents } = useExtensionSidebarContext(); + const styles = useStyles2(getStyles); + + if (isSmallScreen || !enrichedHelpNode.hideFromTabs || !availableComponents.has('grafana-grafanadocsplugin-app')) { + return ( + } placement="bottom-end"> + + + ); + } + + const componentId = getComponentIdFromComponentMeta('grafana-grafanadocsplugin-app', 'Grafana Pathfinder'); + const isOpen = dockedComponentId === componentId; + + return ( + { + if (isOpen) { + setDockedComponentId(undefined); + } else { + const appEvents = getAppEvents(); + appEvents.publish( + new OpenExtensionSidebarEvent({ + pluginId: 'grafana-grafanadocsplugin-app', + componentTitle: 'Grafana Pathfinder', + props: { + helpNode: withoutParents(enrichedHelpNode), + }, + }) + ); + } + }} + /> + ); +}); + +function withoutParents(node: NavModelItem): NavModelItem { + const { parentItem, ...rest } = node; + return { + ...rest, + children: node.children?.map(withoutParents), + }; +} + +const getStyles = (theme: GrafanaTheme2) => ({ + helpButtonActive: css({ + borderRadius: theme.shape.radius.circle, + backgroundColor: theme.colors.primary.transparent, + border: `1px solid ${theme.colors.primary.borderTransparent}`, + color: theme.colors.text.primary, + }), +}); diff --git a/public/app/core/components/AppChrome/TopBar/SingleTopBar.tsx b/public/app/core/components/AppChrome/TopBar/SingleTopBar.tsx index 7de5542b783..c8084dfc3e0 100644 --- a/public/app/core/components/AppChrome/TopBar/SingleTopBar.tsx +++ b/public/app/core/components/AppChrome/TopBar/SingleTopBar.tsx @@ -5,35 +5,30 @@ import React, { memo } from 'react'; import { GrafanaTheme2, NavModelItem } from '@grafana/data'; import { Components } from '@grafana/e2e-selectors'; import { t } from '@grafana/i18n'; -import { ScopesContextValue, getAppEvents } from '@grafana/runtime'; -import { Dropdown, Icon, Stack, ToolbarButton, useStyles2 } from '@grafana/ui'; +import { ScopesContextValue } from '@grafana/runtime'; +import { Icon, Stack, ToolbarButton, useStyles2 } from '@grafana/ui'; import { config } from 'app/core/config'; import { MEGA_MENU_TOGGLE_ID } from 'app/core/constants'; import { useGrafana } from 'app/core/context/GrafanaContext'; import { contextSrv } from 'app/core/core'; import { useMediaQueryMinWidth } from 'app/core/hooks/useMediaQueryMinWidth'; import { HOME_NAV_ID } from 'app/core/reducers/navModel'; -import { OpenExtensionSidebarEvent } from 'app/types/events'; import { useSelector } from 'app/types/store'; import { Branding } from '../../Branding/Branding'; import { Breadcrumbs } from '../../Breadcrumbs/Breadcrumbs'; import { buildBreadcrumbs } from '../../Breadcrumbs/utils'; -import { - useExtensionSidebarContext, - getComponentIdFromComponentMeta, -} from '../ExtensionSidebar/ExtensionSidebarProvider'; import { ExtensionToolbarItem } from '../ExtensionSidebar/ExtensionToolbarItem'; import { HistoryContainer } from '../History/HistoryContainer'; import { enrichHelpItem } from '../MegaMenu/utils'; import { NavToolbarSeparator } from '../NavToolbar/NavToolbarSeparator'; import { QuickAdd } from '../QuickAdd/QuickAdd'; +import { HelpTopBarButton } from './HelpTopBarButton'; import { InviteUserButton } from './InviteUserButton'; import { ProfileButton } from './ProfileButton'; import { SignInLink } from './SignInLink'; import { SingleTopBarActions } from './SingleTopBarActions'; -import { TopNavBarMenu } from './TopNavBarMenu'; import { TopSearchBarCommandPaletteTrigger } from './TopSearchBarCommandPaletteTrigger'; import { getChromeHeaderLevelHeight } from './useChromeHeaderHeight'; @@ -60,7 +55,6 @@ export const SingleTopBar = memo(function SingleTopBar({ }: Props) { const { chrome } = useGrafana(); const state = chrome.useState(); - const { setDockedComponentId, dockedComponentId, availableComponents } = useExtensionSidebarContext(); const menuDockedAndOpen = !state.chromeless && state.megaMenuDocked && state.megaMenuOpen; const styles = useStyles2(getStyles, menuDockedAndOpen); const navIndex = useSelector((state) => state.navIndex); @@ -104,44 +98,7 @@ export const SingleTopBar = memo(function SingleTopBar({ {unifiedHistoryEnabled && !isSmallScreen && } {!isSmallScreen && } - {enrichedHelpNode && - (enrichedHelpNode.hideFromTabs && availableComponents.has('grafana-grafanadocsplugin-app') ? ( - (() => { - const componentId = getComponentIdFromComponentMeta( - 'grafana-grafanadocsplugin-app', - 'Grafana Pathfinder' - ); - const isOpen = dockedComponentId === componentId; - return ( - { - if (isOpen) { - setDockedComponentId(undefined); - } else { - const appEvents = getAppEvents(); - appEvents.publish( - new OpenExtensionSidebarEvent({ - pluginId: 'grafana-grafanadocsplugin-app', - componentTitle: 'Grafana Pathfinder', - props: { - helpNode: withoutParents(enrichedHelpNode), - }, - }) - ); - } - }} - /> - ); - })() - ) : ( - } placement="bottom-end"> - - - ))} + {enrichedHelpNode && } {!isSmallScreen && } {!showToolbarLevel && actions} @@ -157,14 +114,6 @@ export const SingleTopBar = memo(function SingleTopBar({ ); }); -function withoutParents(node: NavModelItem): NavModelItem { - const { parentItem, ...rest } = node; - return { - ...rest, - children: node.children?.map(withoutParents), - }; -} - const getStyles = (theme: GrafanaTheme2, menuDockedAndOpen: boolean) => ({ layout: css({ height: getChromeHeaderLevelHeight(), @@ -193,10 +142,4 @@ const getStyles = (theme: GrafanaTheme2, menuDockedAndOpen: boolean) => ({ display: 'none', }, }), - helpButtonActive: css({ - borderRadius: theme.shape.radius.circle, - backgroundColor: theme.colors.primary.transparent, - border: `1px solid ${theme.colors.primary.borderTransparent}`, - color: theme.colors.text.primary, - }), });