Merge pull request #6097 from jessebye/org-card-tooltips

Add tooltips to org ownership card tiles
This commit is contained in:
Fredrik Adelöw
2021-06-24 11:19:44 +02:00
committed by GitHub
2 changed files with 59 additions and 16 deletions
+5
View File
@@ -0,0 +1,5 @@
---
'@backstage/plugin-org': patch
---
Display a tooltip for ownership cards listing the related entities
@@ -26,6 +26,7 @@ import {
createStyles,
Grid,
makeStyles,
Tooltip,
Typography,
} from '@material-ui/core';
import React from 'react';
@@ -95,39 +96,60 @@ const useStyles = makeStyles((theme: BackstageTheme) =>
}),
);
const countEntitiesBy = (
const listEntitiesBy = (
entities: Array<Entity>,
kind: EntitiesKinds,
type?: EntitiesTypes,
) =>
entities.filter(
e => e.kind === kind && (type ? e?.spec?.type === type : true),
).length;
);
const countEntitiesBy = (
entities: Array<Entity>,
kind: EntitiesKinds,
type?: EntitiesTypes,
) => listEntitiesBy(entities, kind, type).length;
const EntityCountTile = ({
counter,
className,
entities,
name,
}: {
counter: number;
className: EntitiesTypes;
entities: Entity[];
name: string;
}) => {
let entityNames;
const classes = useStyles();
if (entities.length < 20) {
entityNames = entities.map(e => e.metadata.name).join(', ');
} else {
entityNames = `${entities
.map(e => e.metadata.name)
.slice(0, 20)
.join(', ')}, ...`;
}
return (
<Box
className={`${classes.card} ${classes[className]}`}
display="flex"
flexDirection="column"
alignItems="center"
>
<Typography className={classes.bold} variant="h6">
{counter}
</Typography>
<Typography className={classes.bold} variant="h6">
{name}
</Typography>
</Box>
<Tooltip title={entityNames} arrow>
<Box
className={`${classes.card} ${classes[className]}`}
display="flex"
flexDirection="column"
alignItems="center"
>
<Typography className={classes.bold} variant="h6">
{counter}
</Typography>
<Typography className={classes.bold} variant="h6">
{name}
</Typography>
</Box>
</Tooltip>
);
};
@@ -167,6 +189,7 @@ export const OwnershipCard = ({
{
counter: countEntitiesBy(ownedEntitiesList, 'Component', 'service'),
className: 'service',
entities: listEntitiesBy(ownedEntitiesList, 'Component', 'service'),
name: 'Services',
},
{
@@ -176,29 +199,43 @@ export const OwnershipCard = ({
'documentation',
),
className: 'documentation',
entities: listEntitiesBy(
ownedEntitiesList,
'Component',
'documentation',
),
name: 'Documentation',
},
{
counter: countEntitiesBy(ownedEntitiesList, 'API'),
className: 'api',
entities: listEntitiesBy(ownedEntitiesList, 'API'),
name: 'APIs',
},
{
counter: countEntitiesBy(ownedEntitiesList, 'Component', 'library'),
className: 'library',
entities: listEntitiesBy(ownedEntitiesList, 'Component', 'library'),
name: 'Libraries',
},
{
counter: countEntitiesBy(ownedEntitiesList, 'Component', 'website'),
className: 'website',
entities: listEntitiesBy(ownedEntitiesList, 'Component', 'website'),
name: 'Websites',
},
{
counter: countEntitiesBy(ownedEntitiesList, 'Component', 'tool'),
className: 'tool',
entities: listEntitiesBy(ownedEntitiesList, 'Component', 'tool'),
name: 'Tools',
},
] as Array<{ counter: number; className: EntitiesTypes; name: string }>;
] as Array<{
counter: number;
className: EntitiesTypes;
entities: Entity[];
name: string;
}>;
}, [catalogApi, entity]);
if (loading) {
@@ -215,6 +252,7 @@ export const OwnershipCard = ({
<EntityCountTile
counter={c.counter}
className={c.className}
entities={c.entities}
name={c.name}
/>
</Grid>