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/plugins2> 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.",