diff --git a/public/app/features/connections/tabs/ConnectData/CardGrid/CardGrid.tsx b/public/app/features/connections/tabs/ConnectData/CardGrid/CardGrid.tsx index 5de083b9d10..887da273155 100644 --- a/public/app/features/connections/tabs/ConnectData/CardGrid/CardGrid.tsx +++ b/public/app/features/connections/tabs/ConnectData/CardGrid/CardGrid.tsx @@ -3,43 +3,58 @@ import React from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Card, useStyles2 } from '@grafana/ui'; +import { PluginAngularBadge } from 'app/features/plugins/admin/components/Badges'; const getStyles = (theme: GrafanaTheme2) => ({ sourcesList: css` display: grid; - grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); + grid-template-columns: repeat(auto-fill, minmax(380px, 1fr)); gap: 12px; list-style: none; margin-bottom: 80px; `, - card: css` - height: 90px; - padding: 0px 24px; - margin-bottom: 0; - `, - cardContent: css` - display: flex; - align-items: center; - `, - logoWrapper: css` - display: flex; - justify-content: center; - margin-right: 8px; - width: 32px; - height: 32px; - img { - max-width: 100%; - max-height: 100%; - align-self: center; - } - `, - label: css` - color: ${theme.colors.text.primary}; - margin-bottom: 0; - `, + heading: css({ + fontSize: theme.typography.h5.fontSize, + fontWeight: 'inherit', + }), + figure: css({ + width: 'inherit', + marginRight: '0px', + '> img': { + width: theme.spacing(7), + }, + }), + meta: css({ + marginTop: '6px', + position: 'relative', + }), + description: css({ + margin: '0px', + fontSize: theme.typography.bodySmall.fontSize, + }), + card: css({ + gridTemplateAreas: ` + "Figure Heading Actions" + "Figure Description Actions" + "Figure Meta Actions" + "Figure - Actions"`, + }), + logo: css({ + marginRight: theme.spacing(3), + marginLeft: theme.spacing(1), + width: theme.spacing(7), + maxHeight: theme.spacing(7), + }), }); -export type CardGridItem = { id: string; name: string; description: string; url: string; logo?: string }; +export type CardGridItem = { + id: string; + name: string; + description: string; + url: string; + logo?: string; + angularDetected?: boolean; +}; export interface CardGridProps { items: CardGridItem[]; onClickItem?: (e: React.MouseEvent, item: CardGridItem) => void; @@ -61,16 +76,17 @@ export const CardGrid = ({ items, onClickItem }: CardGridProps) => { } }} > - -
- {item.logo && ( -
- {`logo -
- )} -

{item.name}

-
-
+ {item.name} + + + + + + {item.angularDetected ? ( + + + + ) : null} ))} diff --git a/public/app/features/connections/tabs/ConnectData/ConnectData.test.tsx b/public/app/features/connections/tabs/ConnectData/ConnectData.test.tsx index 9c1a89f4d45..4d8b2ad7012 100644 --- a/public/app/features/connections/tabs/ConnectData/ConnectData.test.tsx +++ b/public/app/features/connections/tabs/ConnectData/ConnectData.test.tsx @@ -1,4 +1,4 @@ -import { fireEvent, render, RenderResult, screen } from '@testing-library/react'; +import { fireEvent, render, RenderResult, screen, waitFor } from '@testing-library/react'; import React from 'react'; import { Provider } from 'react-redux'; @@ -32,6 +32,38 @@ const mockCatalogDataSourcePlugin = getCatalogPluginMock({ const originalHasPermission = contextSrv.hasPermission; +describe('Angular badge', () => { + test('does not show angular badge for non-angular plugins', async () => { + renderPage([ + getCatalogPluginMock({ + id: 'react-plugin', + name: 'React Plugin', + type: PluginType.datasource, + angularDetected: false, + }), + ]); + await waitFor(() => { + expect(screen.queryByText('React Plugin')).toBeInTheDocument(); + }); + expect(screen.queryByText('Angular')).not.toBeInTheDocument(); + }); + + test('shows angular badge for angular plugins', async () => { + renderPage([ + getCatalogPluginMock({ + id: 'legacy-plugin', + name: 'Legacy Plugin', + type: PluginType.datasource, + angularDetected: true, + }), + ]); + await waitFor(() => { + expect(screen.queryByText('Legacy Plugin')).toBeInTheDocument(); + }); + expect(screen.queryByText('Angular')).toBeInTheDocument(); + }); +}); + describe('Add new connection', () => { beforeEach(() => { contextSrv.hasPermission = originalHasPermission; diff --git a/public/app/features/connections/tabs/ConnectData/ConnectData.tsx b/public/app/features/connections/tabs/ConnectData/ConnectData.tsx index 0dea5414030..1f65eb7ac23 100644 --- a/public/app/features/connections/tabs/ConnectData/ConnectData.tsx +++ b/public/app/features/connections/tabs/ConnectData/ConnectData.tsx @@ -52,6 +52,7 @@ export function AddNewConnection() { description: plugin.description, logo: plugin.info.logos.small, url: ROUTES.DataSourcesDetails.replace(':id', plugin.id), + angularDetected: plugin.angularDetected, })), [plugins] );