diff --git a/plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx b/plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx index 248d973b..786ee3ef 100644 --- a/plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx +++ b/plugins/cad/src/components/AddPackagePage/AddPackagePage.tsx @@ -41,9 +41,12 @@ import { getCloneTask, getInitTask, getPackageRevisionResource, - sortByPackageNameAndRevisionComparison, } from '../../utils/packageRevision'; -import { getPackageDescriptor } from '../../utils/repository'; +import { + getPackageDescriptor, + isBlueprintRepository, + isDeploymentRepository, +} from '../../utils/repository'; import { getRepositorySummary } from '../../utils/repositorySummary'; import { sortByLabel } from '../../utils/selectItem'; import { toLowerCase } from '../../utils/string'; @@ -73,8 +76,11 @@ export const AddPackagePage = () => { const [baseRepository, setBaseRepository] = useState(); const [repositorySummary, setRepositorySummary] = useState(); + const [allRepositories, setAllRepositories] = useState([]); - const [basePackageName, setBasePackageName] = useState(packageName); + const [basePackageName, setBasePackageName] = useState( + packageName ?? '', + ); const [basePackageRevision, setBasePackageRevision] = useState(); @@ -104,10 +110,13 @@ export const AddPackagePage = () => { ); const { loading, error } = useAsync(async (): Promise => { - const thisRepositorySummary = await getRepositorySummary( - api, - repositoryName, - ); + const [{ items: thisRepositories }, thisRepositorySummary] = + await Promise.all([ + api.listRepositories(), + getRepositorySummary(api, repositoryName), + ]); + + setAllRepositories(thisRepositories); setRepositorySummary(thisRepositorySummary); }); @@ -116,24 +125,31 @@ export const AddPackagePage = () => { const loadRequired = async () => { const setBasePackages = async (): Promise => { - let upstreamBlueprints: SelectItem[] = []; - - if (repositorySummary.upstreamRepository) { - const upstreamRepoName = - repositorySummary.upstreamRepository.metadata.name; - - const upstreamPackages = await api.listPackageRevisions( - upstreamRepoName, - ); - - upstreamBlueprints = upstreamPackages - .filter(canCloneOrDeploy) - .sort(sortByPackageNameAndRevisionComparison) - .map(p => ({ - label: `${p.spec.packageName}:${p.spec.revision}`, - value: p.metadata.name, - })); - } + const allPackages = await api.listPackageRevisions(); + + const getUpstreamPackages = (): PackageRevision[] => { + if (!isDeploymentRepository(repositorySummary.repository)) return []; + + const blueprintRepositories = allRepositories + .filter(isBlueprintRepository) + .map(repostiory => repostiory.metadata.name); + + const upstreamBlueprintPackages = allPackages + .filter(thisPackage => + blueprintRepositories.includes(thisPackage.spec.repository), + ) + .filter(canCloneOrDeploy); + + return upstreamBlueprintPackages; + }; + + const blueprintPackages = getUpstreamPackages(); + const upstreamBlueprints = sortByLabel( + blueprintPackages.map(blueprintPackage => ({ + label: `${blueprintPackage.spec.packageName}:${blueprintPackage.spec.revision}`, + value: blueprintPackage.metadata.name, + })), + ); upstreamBlueprints.unshift({ label: 'none', value: 'none' }); @@ -145,23 +161,25 @@ export const AddPackagePage = () => { }; const setDownstreamRepositories = (): void => { - if (repositorySummary.downstreamRepositories) { - const downstream: SelectItem[] = sortByLabel( - repositorySummary.downstreamRepositories.map(repository => ({ + if (allRepositories && allRepositories.length > 0) { + const deploymentRepositorySelectItems: SelectItem[] = sortByLabel( + allRepositories.filter(isDeploymentRepository).map(repository => ({ label: repository.metadata.name, value: repository.metadata.name, })), ); - setSelectDownstreamRepositoryItems(downstream); - if (downstream.length > 0) { - setTargetRepositoryPackageDescriptor( - getPackageDescriptor(repositorySummary.downstreamRepositories[0]), + setSelectDownstreamRepositoryItems(deploymentRepositorySelectItems); + + setTargetRepositoryPackageDescriptor( + getPackageDescriptor(allRepositories[0]), + ); + + if (deploymentRepositorySelectItems.length === 1) { + setTargetRepositoryName( + deploymentRepositorySelectItems[0].value as string, ); } - if (downstream.length === 1) { - setTargetRepositoryName(downstream[0].value as string); - } } }; @@ -177,7 +195,13 @@ export const AddPackagePage = () => { }; loadRequired(); - }, [api, repositorySummary, packageName, deployToDownstreamRepository]); + }, [ + api, + allRepositories, + repositorySummary, + packageName, + deployToDownstreamRepository, + ]); const getNewPackageRevisionResource = (): PackageRevision => { const baseTask = @@ -202,7 +226,7 @@ export const AddPackagePage = () => { if (targetRepositoryName && repositorySummary) { const findRepository = (): Repository | undefined => { if (deployToDownstreamRepository) { - const thisRepository = repositorySummary.downstreamRepositories.find( + const thisRepository = allRepositories.find( repository => repository.metadata.name === targetRepositoryName, ); return thisRepository; @@ -220,7 +244,12 @@ export const AddPackagePage = () => { ); } } - }, [targetRepositoryName, repositorySummary, deployToDownstreamRepository]); + }, [ + allRepositories, + targetRepositoryName, + repositorySummary, + deployToDownstreamRepository, + ]); useEffect(() => { if (!basePackageName || basePackageName === 'none') return; diff --git a/plugins/cad/src/components/PackageRevisionPage/components/PackageRevisionOptions.tsx b/plugins/cad/src/components/PackageRevisionPage/components/PackageRevisionOptions.tsx index 6e99cf8a..10e8637d 100644 --- a/plugins/cad/src/components/PackageRevisionPage/components/PackageRevisionOptions.tsx +++ b/plugins/cad/src/components/PackageRevisionPage/components/PackageRevisionOptions.tsx @@ -34,7 +34,10 @@ import { findLatestPublishedRevision, isLatestPublishedRevision, } from '../../../utils/packageRevision'; -import { isDeploymentRepository } from '../../../utils/repository'; +import { + isBlueprintRepository, + isDeploymentRepository, +} from '../../../utils/repository'; import { PackageRevisionPageMode } from '../PackageRevisionPage'; export enum RevisionOption { @@ -200,7 +203,7 @@ const PublishedPackageRevisionOptions = ({ } const showDeploy = - repositorySummary.downstreamRepositories.length > 0 && + isBlueprintRepository(repositorySummary.repository) && canCloneOrDeploy(packageRevision); if (latestRevision !== latestPublishedRevision) { diff --git a/plugins/cad/src/utils/packageSummary.ts b/plugins/cad/src/utils/packageSummary.ts index 613c6d5f..d974e80c 100644 --- a/plugins/cad/src/utils/packageSummary.ts +++ b/plugins/cad/src/utils/packageSummary.ts @@ -45,7 +45,7 @@ export type PackageSummary = { export const getPackageSummariesForRepository = ( packageRevisions: PackageRevision[], - upstreamRevisions: PackageRevision[], + allPackageRevisions: PackageRevision[], repository: Repository, ): PackageSummary[] => { const latestPackageRevisions = packageRevisions.filter( @@ -90,14 +90,14 @@ export const getPackageSummariesForRepository = ( thisPackageSummary.upstreamPackageRevision = upstream.revision; thisPackageSummary.upstreamRevision = findPackageRevision( - upstreamRevisions, + allPackageRevisions, upstream.packageName, upstream.revision, ); thisPackageSummary.upstreamLatestPublishedRevision = findLatestPublishedRevision( - filterPackageRevisions(upstreamRevisions, upstream.packageName), + filterPackageRevisions(allPackageRevisions, upstream.packageName), ); thisPackageSummary.isUpgradeAvailable = @@ -124,16 +124,9 @@ export const getPackageSummaries = ( revision.spec.repository === repositorySummary.repository.metadata.name, ); - const upstreamPackageRevisions = packageRevisions.filter( - revision => - repositorySummary.upstreamRepository && - revision.spec.repository === - repositorySummary.upstreamRepository.metadata.name, - ); - const repositoryPackageSummaries = getPackageSummariesForRepository( repositoryPackageRevisions, - upstreamPackageRevisions, + packageRevisions, repositorySummary.repository, );