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 todoeleijonmarck/lbac-for-datasources/check-team-existance-before-adding-rule
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