grafana/public/app/features/plugins/admin/components/PluginSubtitle.tsx
Ashley Harrison 159607fe6f
Navigation: Convert PluginDetails page to use new Page extensions (#58509)
* Added labels

* App page fixes

* Switch to switch

* wip

* Updates

* I am stuck

* Minor tweak

* This props interface could work

* removed change

* use new page extensions in plugin details page

* add link separator, fix action button spacing

* some renaming

* Move PageInfo into it's own folder + add tests

* add support for new props in old page header

* remove PluginDetailsHeader as it's no longer used

* Fix unit tests

* fix some badge alignments

* center align actions

* badge alignment + only show downloads for community/commercial plugins

* better link alignment

* conditionally render description

* move install control warnings to below subtitle + refactor

Co-authored-by: Torkel Ödegaard <torkel@grafana.com>
2022-11-09 14:44:38 +00:00

64 lines
1.8 KiB
TypeScript

import { css } from '@emotion/css';
import React from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { useStyles2 } from '@grafana/ui';
import { InstallControlsWarning } from '../components/InstallControls';
import { getLatestCompatibleVersion, hasInstallControlWarning } from '../helpers';
import { useIsRemotePluginsAvailable } from '../state/hooks';
import { CatalogPlugin, PluginStatus } from '../types';
interface Props {
plugin?: CatalogPlugin;
}
export const PluginSubtitle = ({ plugin }: Props) => {
const isRemotePluginsAvailable = useIsRemotePluginsAvailable();
const styles = useStyles2(getStyles);
if (!plugin) {
return null;
}
const latestCompatibleVersion = getLatestCompatibleVersion(plugin.details?.versions);
const pluginStatus = plugin.isInstalled
? plugin.hasUpdate
? PluginStatus.UPDATE
: PluginStatus.UNINSTALL
: PluginStatus.INSTALL;
return (
<div className={styles.subtitle}>
{plugin?.description && <div>{plugin?.description}</div>}
{plugin?.details?.links && plugin.details.links.length > 0 && (
<span>
{plugin.details.links.map((link, index) => (
<React.Fragment key={index}>
{index > 0 && ' | '}
<a href={link.url} className="external-link">
{link.name}
</a>
</React.Fragment>
))}
</span>
)}
{hasInstallControlWarning(plugin, isRemotePluginsAvailable, latestCompatibleVersion) && (
<InstallControlsWarning
plugin={plugin}
pluginStatus={pluginStatus}
latestCompatibleVersion={latestCompatibleVersion}
/>
)}
</div>
);
};
export const getStyles = (theme: GrafanaTheme2) => {
return {
subtitle: css`
display: flex;
flex-direction: column;
gap: ${theme.spacing(1)};
`,
};
};