mirror of
https://github.com/grafana/grafana.git
synced 2025-02-20 11:48:34 -06:00
* feat(catalog): lazy load and add alt text to plugin logos * refactor(catalog): use plugin types, make sure data is available for new ui * test(catalog): fix up tests after types refactor * feat(catalog): introduce Tile and PluginBadge components for ui updates * refactor(catalog): update PluginList to use new components, lazy load images, add creditcard icon * test(catalog): update Browse.test types * fix(catalog): if local and remote make sure to get the correct local plugin from array * refactor(catalog): prefer grafana/ui components over custom Tile component * chore(catalog): delete redundant components * feat(catalog): introduce ascending descending name sort for Browse * refactor(catalog): prefer theme spacing over hardcoded values * refactor(catalog): update Local and Remote plugin types to match api responses * fix(catalog): prefer local.hasUpdate and local.signature so updateable plugin signature is valid * test(catalog): update test plugin mocks * test(catalog): add tests for sorting and categorise * test(catalog): add tests for plugin cards, remove grid component * test(catalog): add tests for PluginBadges component * refactor(catalog): change enterprise learn more link to open plugin page on website
59 lines
1.7 KiB
TypeScript
59 lines
1.7 KiB
TypeScript
import React from 'react';
|
|
import { css } from '@emotion/css';
|
|
import { Badge, Button, HorizontalGroup, PluginSignatureBadge, useStyles2 } from '@grafana/ui';
|
|
import { GrafanaTheme2 } from '@grafana/data';
|
|
import { config } from '@grafana/runtime';
|
|
import { CatalogPlugin } from '../types';
|
|
|
|
type PluginBadgeType = {
|
|
plugin: CatalogPlugin;
|
|
};
|
|
|
|
export function PluginBadges({ plugin }: PluginBadgeType) {
|
|
if (plugin.isEnterprise) {
|
|
return <EnterpriseBadge id={plugin.id} />;
|
|
}
|
|
return (
|
|
<HorizontalGroup>
|
|
<PluginSignatureBadge status={plugin.signature} />
|
|
{plugin.isInstalled && <InstalledBadge />}
|
|
</HorizontalGroup>
|
|
);
|
|
}
|
|
|
|
function EnterpriseBadge({ id }: { id: string }) {
|
|
const customBadgeStyles = useStyles2(getBadgeColor);
|
|
const onClick = (ev: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {
|
|
ev.preventDefault();
|
|
window.open(
|
|
`https://grafana.com/grafana/plugins/${id}?utm_source=grafana_catalog_learn_more`,
|
|
'_blank',
|
|
'noopener,noreferrer'
|
|
);
|
|
};
|
|
|
|
if (config.licenseInfo?.hasValidLicense) {
|
|
return <Badge text="Enterprise" color="blue" />;
|
|
}
|
|
|
|
return (
|
|
<HorizontalGroup>
|
|
<Badge icon="lock" aria-label="lock icon" text="Enterprise" color="blue" className={customBadgeStyles} />
|
|
<Button size="sm" fill="text" icon="external-link-alt" onClick={onClick}>
|
|
Learn more
|
|
</Button>
|
|
</HorizontalGroup>
|
|
);
|
|
}
|
|
|
|
function InstalledBadge() {
|
|
const customBadgeStyles = useStyles2(getBadgeColor);
|
|
return <Badge text="Installed" color="orange" className={customBadgeStyles} />;
|
|
}
|
|
|
|
const getBadgeColor = (theme: GrafanaTheme2) => css`
|
|
background: ${theme.colors.background.primary};
|
|
border-color: ${theme.colors.border.strong};
|
|
color: ${theme.colors.text.secondary};
|
|
`;
|