Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Entity } from '@backstage/catalog-model/index';
import { useEntity } from '@backstage/plugin-catalog-react';
import { useMemo } from 'react';

const ConditionalEntityWrapper = ({
children,
activationFn,
}: {
children: React.ReactNode;
activationFn: (entity: Entity) => boolean;
}) => {
const { entity } = useEntity();
const isActive = useMemo(() => activationFn(entity), [entity, activationFn]);
return isActive ? children : null;
};

export default ConditionalEntityWrapper;
221 changes: 128 additions & 93 deletions packages/app/src/components/catalog/EntityPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ import {
RuntimeLogs,
Builds,
} from '@openchoreo/backstage-plugin';
import ConditionalEntityWrapper from '../ConditionalEntityWrapper/ConditionalEntityWrapper';

const techdocsContent = (
<EntityTechdocsContent>
Expand Down Expand Up @@ -150,107 +151,116 @@ const overviewContent = (
</Grid>
);

const serviceEntityPage = (
<EntityLayout>
<EntityLayout.Route path="/" title="Overview">
{overviewContent}
</EntityLayout.Route>

<EntityLayout.Route path="/builds" title="Builds">
<Builds />
</EntityLayout.Route>

<EntityLayout.Route path="/environments" title="Deploy">
<Environments />
</EntityLayout.Route>
<EntityLayout.Route path="/runtime-logs" title="Runtime Logs">
<RuntimeLogs />
</EntityLayout.Route>

{/* <EntityLayout.Route path="/ci-cd" title="CI/CD">
{cicdContent}
</EntityLayout.Route> */}
const overviewRoute = (
<EntityLayout.Route path="/" title="Overview" key="overview">
{overviewContent}
</EntityLayout.Route>
);

<EntityLayout.Route
path="/kubernetes"
title="Kubernetes"
if={isKubernetesAvailable}
>
<EntityKubernetesContent />
</EntityLayout.Route>
const coreRoutes = [
<EntityLayout.Route path="/environments" title="Deploy" key="environments">
<Environments />
</EntityLayout.Route>,
<EntityLayout.Route
path="/runtime-logs"
title="Runtime Logs"
key="runtime-logs"
>
<RuntimeLogs />
</EntityLayout.Route>,
<EntityLayout.Route
path="/kubernetes"
title="Kubernetes"
if={isKubernetesAvailable}
key="kubernetes"
>
<EntityKubernetesContent />
</EntityLayout.Route>,
];

const buildsRoute = (
<EntityLayout.Route path="/builds" title="Builds" key="builds">
<Builds />
</EntityLayout.Route>
);

<EntityLayout.Route path="/api" title="API">
<Grid container spacing={3} alignItems="stretch">
<Grid item md={6}>
<EntityProvidedApisCard />
</Grid>
<Grid item md={6}>
<EntityConsumedApisCard />
</Grid>
const apiRoute = (
<EntityLayout.Route path="/api" title="API" key="api">
<Grid container spacing={3} alignItems="stretch">
<Grid item md={6}>
<EntityProvidedApisCard />
</Grid>
</EntityLayout.Route>

<EntityLayout.Route path="/dependencies" title="Dependencies">
<Grid container spacing={3} alignItems="stretch">
<Grid item md={6}>
<EntityDependsOnComponentsCard variant="gridItem" />
</Grid>
<Grid item md={6}>
<EntityDependsOnResourcesCard variant="gridItem" />
</Grid>
<Grid item md={6}>
<EntityConsumedApisCard />
</Grid>
</EntityLayout.Route>

<EntityLayout.Route path="/docs" title="Docs">
{techdocsContent}
</EntityLayout.Route>
</EntityLayout>
</Grid>
</EntityLayout.Route>
);

const websiteEntityPage = (
<EntityLayout>
<EntityLayout.Route path="/" title="Overview">
{overviewContent}
</EntityLayout.Route>

<EntityLayout.Route path="/builds" title="Builds">
<Builds />
</EntityLayout.Route>

<EntityLayout.Route path="/environments" title="Deploy">
<Environments />
</EntityLayout.Route>
const dependenciesRoute = (
<EntityLayout.Route
path="/dependencies"
title="Dependencies"
key="dependencies"
>
<Grid container spacing={3} alignItems="stretch">
<Grid item md={6}>
<EntityDependsOnComponentsCard variant="gridItem" />
</Grid>
<Grid item md={6}>
<EntityDependsOnResourcesCard variant="gridItem" />
</Grid>
</Grid>
</EntityLayout.Route>
);

<EntityLayout.Route path="/runtime-logs" title="Runtime Logs">
<RuntimeLogs />
</EntityLayout.Route>
const docsRoute = (
<EntityLayout.Route path="/docs" title="Docs" key="docs">
{techdocsContent}
</EntityLayout.Route>
);

{/* <EntityLayout.Route path="/ci-cd" title="CI/CD">
{cicdContent}
</EntityLayout.Route> */}
const serviceImageEntityPage = (
<>
<EntityLayout>
{overviewRoute}
{coreRoutes}
{apiRoute}
{dependenciesRoute}
{docsRoute}
</EntityLayout>
</>
);

<EntityLayout.Route
path="/kubernetes"
title="Kubernetes"
if={isKubernetesAvailable}
>
<EntityKubernetesContent />
</EntityLayout.Route>
const serviceSourceEntityPage = (
<EntityLayout>
{overviewRoute}
{buildsRoute}
{coreRoutes}
{apiRoute}
{dependenciesRoute}
{docsRoute}
</EntityLayout>
);

<EntityLayout.Route path="/dependencies" title="Dependencies">
<Grid container spacing={3} alignItems="stretch">
<Grid item md={6}>
<EntityDependsOnComponentsCard variant="gridItem" />
</Grid>
<Grid item md={6}>
<EntityDependsOnResourcesCard variant="gridItem" />
</Grid>
</Grid>
</EntityLayout.Route>
const websiteImageEntityPage = (
<>
<EntityLayout>
{overviewRoute}
{coreRoutes}
{dependenciesRoute}
{docsRoute}
</EntityLayout>
</>
);

<EntityLayout.Route path="/docs" title="Docs">
{techdocsContent}
</EntityLayout.Route>
const websiteSourceEntityPage = (
<EntityLayout>
{overviewRoute}
{buildsRoute}
{coreRoutes}
{dependenciesRoute}
{docsRoute}
</EntityLayout>
);

Expand All @@ -276,13 +286,38 @@ const defaultEntityPage = (
const componentPage = (
<EntitySwitch>
<EntitySwitch.Case if={isComponentType('service')}>
{serviceEntityPage}
<ConditionalEntityWrapper
activationFn={e =>
!e.metadata.annotations?.['backstage.io/source-location']
}
>
{serviceImageEntityPage}
</ConditionalEntityWrapper>
<ConditionalEntityWrapper
activationFn={e =>
!!e.metadata.annotations?.['backstage.io/source-location']
}
>
{serviceSourceEntityPage}
</ConditionalEntityWrapper>
</EntitySwitch.Case>

<EntitySwitch.Case if={isComponentType('website')}>
{websiteEntityPage}
<ConditionalEntityWrapper
activationFn={e =>
!e.metadata.annotations?.['backstage.io/source-location']
}
>
{websiteImageEntityPage}
</ConditionalEntityWrapper>
<ConditionalEntityWrapper
activationFn={e =>
!!e.metadata.annotations?.['backstage.io/source-location']
}
>
{websiteSourceEntityPage}
</ConditionalEntityWrapper>
</EntitySwitch.Case>

<EntitySwitch.Case>{defaultEntityPage}</EntitySwitch.Case>
</EntitySwitch>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,6 @@ export class OpenChoreoEntityProvider implements EntityProvider {
if (component.type === 'WebApplication') {
backstageComponentType = 'website';
}

const componentEntity: Entity = {
apiVersion: 'backstage.io/v1alpha1',
kind: 'Component',
Expand All @@ -288,11 +287,11 @@ export class OpenChoreoEntityProvider implements EntityProvider {
[CHOREO_ANNOTATIONS.ORGANIZATION]: orgName,
[CHOREO_ANNOTATIONS.CREATED_AT]: component.createdAt,
[CHOREO_ANNOTATIONS.STATUS]: component.status,
...(component.repositoryUrl && {
'backstage.io/source-location': `url:${component.repositoryUrl}`,
...(component.buildConfig?.repoUrl && {
'backstage.io/source-location': `url:${component.buildConfig?.repoUrl}`,
}),
...(component.branch && {
[CHOREO_ANNOTATIONS.BRANCH]: component.branch,
...(component.buildConfig?.repoBranch && {
[CHOREO_ANNOTATIONS.BRANCH]: component.buildConfig?.repoBranch,
}),
},
labels: {
Expand Down
Loading