import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { Trans, t } from '@grafana/i18n'; import { config } from '@grafana/runtime'; import { Checkbox, EmptyState, Icon, Spinner, Tooltip, useStyles2 } from '@grafana/ui'; import { CatalogPlugin } from '../types'; type UpdateError = { id: string; message: string; }; const getStyles = (theme: GrafanaTheme2) => ({ table: css({ marginTop: theme.spacing(2), width: '100%', borderCollapse: 'collapse', }), tableRow: css({ borderBottom: `1px solid ${theme.colors.border.weak}`, td: { paddingRight: theme.spacing(1), }, }), icon: css({ display: 'flex', justifyContent: 'center', alignItems: 'center', }), header: css({ textAlign: 'left', padding: theme.spacing(1), borderBottom: `2px solid ${theme.colors.border.strong}`, th: { paddingRight: theme.spacing(1), }, }), data: css({ padding: '10px', }), footer: css({ fontSize: theme.typography.bodySmall.fontSize, marginTop: theme.spacing(3), }), noPluginsMessage: css({ display: 'flex', alignItems: 'center', justifyContent: 'center', height: '100%', }), tableContainer: css({ overflowY: 'auto', overflowX: 'hidden', maxHeight: theme.spacing(41), marginBottom: theme.spacing(2), }), errorIcon: css({ color: theme.colors.error.main, }), successIcon: css({ color: theme.colors.success.main, }), pluginsInstalled: css({ svg: { marginRight: theme.spacing(1), }, }), }); const StatusIcon = ({ id, inProgress, isSelected, isInstalled, errorMap, }: { id: string; inProgress: boolean; isSelected: boolean; isInstalled: boolean; errorMap: Map; }) => { const styles = useStyles2(getStyles); if (errorMap && errorMap.has(id)) { return ( ); } if (isInstalled) { return ; } if (inProgress && isSelected) { return ; } return ''; }; type Props = { plugins: CatalogPlugin[]; pluginsNotInstalled: Set; inProgress: boolean; selectedPlugins?: Set; onCheckboxChange: (id: string) => void; errorMap: Map; }; export const UpdateModalBody = ({ plugins, pluginsNotInstalled, inProgress, selectedPlugins, onCheckboxChange, errorMap, }: Props) => { const styles = useStyles2(getStyles); const numberInstalled = plugins.length - pluginsNotInstalled.size; const installationFinished = plugins.length !== pluginsNotInstalled.size && !inProgress; return (
{plugins.length === 0 ? ( ) : ( <>
The following plugins have update available
{plugins.map(({ id, name, installedVersion, latestVersion }: CatalogPlugin) => ( ))}
Update Name Installed Available
onCheckboxChange(id)} value={selectedPlugins?.has(id)} disabled={!pluginsNotInstalled.has(id)} /> {name} {installedVersion} {latestVersion}
{numberInstalled > 0 && installationFinished && (
{`${numberInstalled} ${t('plugins.catalog.update-all.update-status-text', 'plugins updated')}`}
)} {errorMap.size > 0 && installationFinished && (
{`${errorMap.size} ${t('plugins.catalog.update-all.error-status-text', 'failed - see error messages')}`}
)} {config.pluginAdminExternalManageEnabled && ( )} )}
); };