Added type parameterization to allow for type safety on new RelatedEntitiesCard.

Signed-off-by: Jonah Grimes <jgrimes@appriss.com>
This commit is contained in:
Jonah Grimes
2021-04-29 17:05:19 -04:00
parent 38df6b64f3
commit 1de4461de1
9 changed files with 39 additions and 38 deletions
@@ -18,8 +18,8 @@ import { RELATION_DEPENDS_ON } from '@backstage/catalog-model';
import React from 'react';
import {
asComponentEntities,
componentColumns,
componentHelpLink,
componentEntityColumns,
componentEntityHelpLink,
RelatedEntitiesCard,
} from '../RelatedEntitiesCard';
@@ -34,9 +34,9 @@ export const DependsOnComponentsCard = ({ variant = 'gridItem' }: Props) => {
title="Components"
entityKind="Component"
relationType={RELATION_DEPENDS_ON}
columns={componentColumns}
columns={componentEntityColumns}
emptyMessage="No component is a dependency of this component"
emptyHelpLink={componentHelpLink}
emptyHelpLink={componentEntityHelpLink}
asRenderableEntities={asComponentEntities}
/>
);
@@ -18,9 +18,9 @@ import { RELATION_DEPENDS_ON } from '@backstage/catalog-model';
import React from 'react';
import {
asResourceEntities,
componentHelpLink,
componentEntityHelpLink,
RelatedEntitiesCard,
resourceColumns,
resourceEntityColumns,
} from '../RelatedEntitiesCard';
type Props = {
@@ -34,9 +34,9 @@ export const DependsOnResourcesCard = ({ variant = 'gridItem' }: Props) => {
title="Resources"
entityKind="Resource"
relationType={RELATION_DEPENDS_ON}
columns={resourceColumns}
columns={resourceEntityColumns}
emptyMessage="No resource is a dependency of this component"
emptyHelpLink={componentHelpLink}
emptyHelpLink={componentEntityHelpLink}
asRenderableEntities={asResourceEntities}
/>
);
@@ -18,8 +18,8 @@ import { RELATION_HAS_PART } from '@backstage/catalog-model';
import React from 'react';
import {
asComponentEntities,
componentColumns,
componentHelpLink,
componentEntityColumns,
componentEntityHelpLink,
RelatedEntitiesCard,
} from '../RelatedEntitiesCard';
@@ -34,9 +34,9 @@ export const HasComponentsCard = ({ variant = 'gridItem' }: Props) => {
title="Components"
entityKind="Component"
relationType={RELATION_HAS_PART}
columns={componentColumns}
columns={componentEntityColumns}
emptyMessage="No component is part of this system"
emptyHelpLink={componentHelpLink}
emptyHelpLink={componentEntityHelpLink}
asRenderableEntities={asComponentEntities}
/>
);
@@ -19,8 +19,8 @@ import React from 'react';
import {
asResourceEntities,
RelatedEntitiesCard,
resourceColumns,
resourceHelpLink,
resourceEntityColumns,
resourceEntityHelpLink,
} from '../RelatedEntitiesCard';
type Props = {
@@ -34,10 +34,10 @@ export const HasResourcesCard = ({ variant = 'gridItem' }: Props) => {
title="Resources"
entityKind="Resource"
relationType={RELATION_HAS_PART}
columns={resourceColumns}
columns={resourceEntityColumns}
asRenderableEntities={asResourceEntities}
emptyMessage="No resource is part of this system"
emptyHelpLink={resourceHelpLink}
emptyHelpLink={resourceEntityHelpLink}
/>
);
};
@@ -18,7 +18,7 @@ import { RELATION_HAS_PART } from '@backstage/catalog-model';
import React from 'react';
import {
asComponentEntities,
componentColumns,
componentEntityColumns,
RelatedEntitiesCard,
} from '../RelatedEntitiesCard';
@@ -33,7 +33,7 @@ export const HasSubcomponentsCard = ({ variant = 'gridItem' }: Props) => {
title="Subcomponents"
entityKind="Component"
relationType={RELATION_HAS_PART}
columns={componentColumns}
columns={componentEntityColumns}
asRenderableEntities={asComponentEntities}
emptyMessage="No subcomponent is part of this component"
emptyHelpLink="https://backstage.io/docs/features/software-catalog/descriptor-format#specsubcomponentof-optional"
@@ -19,8 +19,8 @@ import React from 'react';
import {
asSystemEntities,
RelatedEntitiesCard,
systemColumns,
systemHelpLink,
systemEntityColumns,
systemEntityHelpLink,
} from '../RelatedEntitiesCard';
type Props = {
@@ -34,10 +34,10 @@ export const HasSystemsCard = ({ variant = 'gridItem' }: Props) => {
title="Systems"
entityKind="System"
relationType={RELATION_HAS_PART}
columns={systemColumns}
columns={systemEntityColumns}
asRenderableEntities={asSystemEntities}
emptyMessage="No system is part of this domain"
emptyHelpLink={systemHelpLink}
emptyHelpLink={systemEntityHelpLink}
/>
);
};
@@ -31,18 +31,18 @@ import {
} from '@backstage/plugin-catalog-react';
import React from 'react';
type Props = {
type Props<T extends Entity> = {
variant?: 'gridItem';
title: string;
columns: TableColumn<Entity>[];
columns: TableColumn<T>[];
entityKind: string;
relationType: string;
emptyMessage: string;
emptyHelpLink: string;
asRenderableEntities: (entities: Entity[]) => Entity[];
asRenderableEntities: (entities: Entity[]) => T[];
};
export const RelatedEntitiesCard = ({
export function RelatedEntitiesCard<T extends Entity>({
variant = 'gridItem',
title,
columns,
@@ -51,7 +51,7 @@ export const RelatedEntitiesCard = ({
emptyMessage,
emptyHelpLink,
asRenderableEntities,
}: Props) => {
}: Props<T>) {
const { entity } = useEntity();
const { entities, loading, error } = useRelatedEntities(entity, {
type: relationType,
@@ -94,4 +94,4 @@ export const RelatedEntitiesCard = ({
entities={asRenderableEntities(entities)}
/>
);
};
}
@@ -15,4 +15,4 @@
*/
export { RelatedEntitiesCard } from './RelatedEntitiesCard';
export * from './constants';
export * from './presets';
@@ -19,38 +19,39 @@ import {
ResourceEntity,
SystemEntity,
} from '@backstage/catalog-model';
import { TableColumn } from '@backstage/core';
import { EntityTable } from '@backstage/plugin-catalog-react';
export const componentColumns = [
export const componentEntityColumns: TableColumn<ComponentEntity>[] = [
EntityTable.columns.createEntityRefColumn({ defaultKind: 'component' }),
EntityTable.columns.createOwnerColumn(),
EntityTable.columns.createSpecTypeColumn(),
EntityTable.columns.createSpecLifecycleColumn(),
EntityTable.columns.createMetadataDescriptionColumn(),
];
export const componentHelpLink =
export const componentEntityHelpLink: string =
'https://backstage.io/docs/features/software-catalog/descriptor-format#kind-component';
export const asComponentEntities = (entities: Entity[]) =>
export const asComponentEntities = (entities: Entity[]): ComponentEntity[] =>
entities as ComponentEntity[];
export const resourceColumns = [
export const resourceEntityColumns: TableColumn<ResourceEntity>[] = [
EntityTable.columns.createEntityRefColumn({ defaultKind: 'resource' }),
EntityTable.columns.createOwnerColumn(),
EntityTable.columns.createSpecTypeColumn(),
EntityTable.columns.createSpecLifecycleColumn(),
EntityTable.columns.createMetadataDescriptionColumn(),
];
export const resourceHelpLink =
export const resourceEntityHelpLink: string =
'https://backstage.io/docs/features/software-catalog/descriptor-format#kind-resource';
export const asResourceEntities = (entities: Entity[]) =>
export const asResourceEntities = (entities: Entity[]): ResourceEntity[] =>
entities as ResourceEntity[];
export const systemColumns = [
export const systemEntityColumns: TableColumn<SystemEntity>[] = [
EntityTable.columns.createEntityRefColumn({ defaultKind: 'system' }),
EntityTable.columns.createOwnerColumn(),
EntityTable.columns.createMetadataDescriptionColumn(),
];
export const systemHelpLink =
export const systemEntityHelpLink: string =
'https://backstage.io/docs/features/software-catalog/descriptor-format#kind-system';
export const asSystemEntities = (entities: Entity[]) =>
export const asSystemEntities = (entities: Entity[]): SystemEntity[] =>
entities as SystemEntity[];