mirror of https://github.com/grafana/grafana
Explore: Show links to queryless apps (#96625)
* Extract basic extensions to a separate files * Add simple queryless apps links * Move links for queryless apps next to the datasource picker * Update tests * Add translations * Add tracking * Update translations * Fix tests and betterer * Fix the mock for the test (the hook may be called twice now) * Add a todopull/97918/head
parent
8bb24bc7b3
commit
bb673fc8ed
@ -0,0 +1,47 @@ |
|||||||
|
import { lazy, Suspense } from 'react'; |
||||||
|
|
||||||
|
import { Dropdown, ToolbarButton } from '@grafana/ui'; |
||||||
|
import { contextSrv } from 'app/core/services/context_srv'; |
||||||
|
import { AccessControlAction } from 'app/types/accessControl'; |
||||||
|
|
||||||
|
import { Trans } from '../../../../core/internationalization'; |
||||||
|
import { ToolbarExtensionPointMenu } from '../ToolbarExtensionPointMenu'; |
||||||
|
|
||||||
|
import { ExtensionDropdownProps } from './types'; |
||||||
|
|
||||||
|
const AddToDashboard = lazy(() => |
||||||
|
import('./../AddToDashboard').then(({ AddToDashboard }) => ({ default: AddToDashboard })) |
||||||
|
); |
||||||
|
|
||||||
|
export function BasicExtensions(props: ExtensionDropdownProps) { |
||||||
|
const { exploreId, links, setSelectedExtension, setIsModalOpen, isModalOpen, noQueriesInPane } = props; |
||||||
|
// If we only have the explore core extension point registered we show the old way of
|
||||||
|
// adding a query to a dashboard.
|
||||||
|
if (links.length <= 1) { |
||||||
|
const canAddPanelToDashboard = |
||||||
|
contextSrv.hasPermission(AccessControlAction.DashboardsCreate) || |
||||||
|
contextSrv.hasPermission(AccessControlAction.DashboardsWrite); |
||||||
|
|
||||||
|
if (!canAddPanelToDashboard) { |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
return ( |
||||||
|
<Suspense fallback={null}> |
||||||
|
<AddToDashboard exploreId={exploreId} /> |
||||||
|
</Suspense> |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
const menu = <ToolbarExtensionPointMenu extensions={links} onSelect={setSelectedExtension} />; |
||||||
|
|
||||||
|
return ( |
||||||
|
<> |
||||||
|
<Dropdown onVisibleChange={setIsModalOpen} placement="bottom-start" overlay={menu}> |
||||||
|
<ToolbarButton aria-label="Add" disabled={!Boolean(noQueriesInPane)} variant="canvas" isOpen={isModalOpen}> |
||||||
|
<Trans i18nKey="explore.toolbar.add-to-extensions">Add</Trans> |
||||||
|
</ToolbarButton> |
||||||
|
</Dropdown> |
||||||
|
</> |
||||||
|
); |
||||||
|
} |
||||||
@ -0,0 +1,42 @@ |
|||||||
|
import { first } from 'lodash'; |
||||||
|
|
||||||
|
import { Dropdown, ToolbarButton } from '@grafana/ui'; |
||||||
|
|
||||||
|
import { Trans } from '../../../../core/internationalization'; |
||||||
|
import { ToolbarExtensionPointMenu } from '../ToolbarExtensionPointMenu'; |
||||||
|
|
||||||
|
import { ExtensionDropdownProps } from './types'; |
||||||
|
|
||||||
|
export function QuerylessAppsExtensions(props: ExtensionDropdownProps) { |
||||||
|
const { links, setSelectedExtension, setIsModalOpen, isModalOpen, noQueriesInPane } = props; |
||||||
|
|
||||||
|
if (links.length === 0) { |
||||||
|
return undefined; |
||||||
|
} |
||||||
|
|
||||||
|
const menu = <ToolbarExtensionPointMenu extensions={links} onSelect={setSelectedExtension} />; |
||||||
|
|
||||||
|
if (links.length === 1) { |
||||||
|
const link = first(links)!; |
||||||
|
return ( |
||||||
|
<ToolbarButton variant="canvas" icon={link.icon} onClick={() => setSelectedExtension(link)}> |
||||||
|
<Trans i18nKey="explore.toolbar.add-to-queryless-extensions">Go queryless</Trans> |
||||||
|
</ToolbarButton> |
||||||
|
); |
||||||
|
} |
||||||
|
|
||||||
|
return ( |
||||||
|
<> |
||||||
|
<Dropdown onVisibleChange={setIsModalOpen} placement="bottom-start" overlay={menu}> |
||||||
|
<ToolbarButton |
||||||
|
aria-label="Go Queryless" |
||||||
|
disabled={!Boolean(noQueriesInPane)} |
||||||
|
variant="canvas" |
||||||
|
isOpen={isModalOpen} |
||||||
|
> |
||||||
|
<Trans i18nKey="explore.toolbar.add-to-queryless-extensions">Go queryless</Trans> |
||||||
|
</ToolbarButton> |
||||||
|
</Dropdown> |
||||||
|
</> |
||||||
|
); |
||||||
|
} |
||||||
@ -0,0 +1,10 @@ |
|||||||
|
import { PluginExtensionLink } from '@grafana/data'; |
||||||
|
|
||||||
|
export type ExtensionDropdownProps = { |
||||||
|
links: PluginExtensionLink[]; |
||||||
|
exploreId: string; |
||||||
|
setSelectedExtension: (extension: PluginExtensionLink) => void; |
||||||
|
setIsModalOpen: (value: boolean) => void; |
||||||
|
isModalOpen: boolean; |
||||||
|
noQueriesInPane: boolean; |
||||||
|
}; |
||||||
Loading…
Reference in new issue