diff --git a/.betterer.results b/.betterer.results index 9d7e63175ae..0ac3ad0c701 100644 --- a/.betterer.results +++ b/.betterer.results @@ -2627,9 +2627,6 @@ exports[`better eslint`] = { "public/app/features/plugins/admin/components/GetStartedWithPlugin/index.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./GetStartedWithPlugin\`)", "0"] ], - "public/app/features/plugins/admin/components/InstallControls/InstallControlsWarning.tsx:5381": [ - [0, 0, 0, "\'HorizontalGroup\' import from \'@grafana/ui\' is restricted from being used by a pattern. Use Stack component instead.", "0"] - ], "public/app/features/plugins/admin/components/InstallControls/index.tsx:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./InstallControlsButton\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`./InstallControlsWarning\`)", "1"] diff --git a/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.tsx b/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.tsx index 23ae522d11a..288eba13443 100644 --- a/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.tsx +++ b/public/app/features/plugins/admin/components/InstallControls/InstallControlsButton.tsx @@ -2,15 +2,16 @@ import { useEffect, useState } from 'react'; import { useLocation } from 'react-router-dom-v5-compat'; import { AppEvents } from '@grafana/data'; -import { t } from '@grafana/i18n'; +import { GrafanaEdition } from '@grafana/data/internal'; +import { t, Trans } from '@grafana/i18n'; import { config, locationService, reportInteraction } from '@grafana/runtime'; -import { Button, ConfirmModal, Stack } from '@grafana/ui'; +import { Button, ConfirmModal, LinkButton, Stack } from '@grafana/ui'; import appEvents from 'app/core/app_events'; import { useQueryParams } from 'app/core/hooks/useQueryParams'; import { removePluginFromNavTree } from 'app/core/reducers/navBarTree'; import { useDispatch } from 'app/types'; -import { isDisabledAngularPlugin } from '../../helpers'; +import { getExternalManageLink, isDisabledAngularPlugin } from '../../helpers'; import { useInstallStatus, useUninstallStatus, @@ -164,6 +165,22 @@ export function InstallControlsButton({ ); } + const isOpenSource = config.buildInfo.edition === GrafanaEdition.OpenSource; + + // Show learn more button for an enterprise plugin if your on OSS + if (plugin.isEnterprise && isOpenSource) { + return ( + + Learn more + + ); + } + if (!plugin.isPublished || hasInstallWarning) { // Cannot be updated or installed return null; diff --git a/public/app/features/plugins/admin/components/InstallControls/InstallControlsWarning.tsx b/public/app/features/plugins/admin/components/InstallControls/InstallControlsWarning.tsx index c9a7d12a0ec..1ccdc6e5311 100644 --- a/public/app/features/plugins/admin/components/InstallControls/InstallControlsWarning.tsx +++ b/public/app/features/plugins/admin/components/InstallControls/InstallControlsWarning.tsx @@ -1,9 +1,10 @@ import { css } from '@emotion/css'; import { GrafanaTheme2, PluginType } from '@grafana/data'; +import { GrafanaEdition } from '@grafana/data/internal'; import { Trans, t } from '@grafana/i18n'; import { config, featureEnabled } from '@grafana/runtime'; -import { HorizontalGroup, LinkButton, useStyles2, Alert, TextLink } from '@grafana/ui'; +import { LinkButton, useStyles2, Alert, TextLink, Stack } from '@grafana/ui'; import { contextSrv } from 'app/core/core'; import { AccessControlAction } from 'app/types'; @@ -38,14 +39,26 @@ export const InstallControlsWarning = ({ plugin, pluginStatus, latestCompatibleV ); } + const isOpenSource = config.buildInfo.edition === GrafanaEdition.OpenSource; + const isEnterprise = config.buildInfo.edition === GrafanaEdition.Enterprise; + if (plugin.isEnterprise && !featureEnabled('enterprise.plugins')) { + const severity = isOpenSource ? 'info' : 'warning'; + return ( - - + + - - No valid Grafana Enterprise license detected. - + {isOpenSource && ( + + This plugin is only available in Grafana Cloud and Grafana Enterprise. + + )} + {isEnterprise && ( + + No valid Grafana Enterprise license detected. + + )} Learn more - + ); } diff --git a/public/app/features/plugins/admin/pages/PluginDetails.test.tsx b/public/app/features/plugins/admin/pages/PluginDetails.test.tsx index ecb2b9748da..fa787881864 100644 --- a/public/app/features/plugins/admin/pages/PluginDetails.test.tsx +++ b/public/app/features/plugins/admin/pages/PluginDetails.test.tsx @@ -9,6 +9,7 @@ import { dateTimeFormatTimeAgo, WithAccessControlMetadata, } from '@grafana/data'; +import { GrafanaEdition } from '@grafana/data/internal'; import { selectors } from '@grafana/e2e-selectors'; import { config } from '@grafana/runtime'; import { configureStore } from 'app/store/configureStore'; @@ -354,6 +355,7 @@ describe('Plugin details page', () => { it('should not display install button for enterprise plugins if license is invalid (but allow uninstall)', async () => { config.licenseInfo.enabledFeatures = {}; + config.buildInfo.edition = GrafanaEdition.Enterprise; const { queryByRole, queryByText } = renderPluginDetails({ id, isInstalled: true, isEnterprise: true }); diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index da8b883534a..bd98aa46a01 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -9607,6 +9607,7 @@ }, "install-controls-warning": { "body-not-published": "This plugin is not published to <2>grafana.com/plugins and can't be managed via the catalog.", + "enterprise-plugin-info": "This plugin is only available in Grafana Cloud and Grafana Enterprise.", "learn-more": "Learn more", "no-valid-grafana-enterprise-license-detected": "No valid Grafana Enterprise license detected.", "title-dev-alert": "This is a development build of the plugin and can't be uninstalled.",