diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx index cf1ee66810..9aa0ec5eef 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx @@ -28,6 +28,7 @@ import { import { useEntityList } from '@backstage/plugin-catalog-react'; import { Typography } from '@material-ui/core'; import { TemplateCard } from '../TemplateCard'; +import { isTemplateEntity } from '../../lib/isTemplateEntity'; /** * @internal @@ -53,23 +54,10 @@ export const TemplateList = ({ }: TemplateListProps) => { const { loading, error, entities } = useEntityList(); const Card = TemplateCardComponent || TemplateCard; + const templateEntities = entities.filter(isTemplateEntity); const maybeFilteredEntities = ( - group - ? entities - .filter( - (e): e is TemplateEntityV1beta3 => - e.kind === 'Template' && - e.apiVersion === 'scaffolder.backstage.io/v1beta3', - ) - .filter(group.filter) - : entities - ) - .filter( - (e): e is TemplateEntityV1beta3 => - e.kind === 'Template' && - e.apiVersion === 'scaffolder.backstage.io/v1beta3', - ) - .filter(e => (templateFilter ? !templateFilter(e) : true)); + group ? templateEntities.filter(group.filter) : templateEntities + ).filter(e => (templateFilter ? !templateFilter(e) : true)); const titleComponent: React.ReactNode = (() => { if (group && group.title) { diff --git a/plugins/scaffolder/src/lib/isTemplateEntity.ts b/plugins/scaffolder/src/lib/isTemplateEntity.ts new file mode 100644 index 0000000000..61ceabaa53 --- /dev/null +++ b/plugins/scaffolder/src/lib/isTemplateEntity.ts @@ -0,0 +1,23 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Entity } from '@backstage/catalog-model'; +import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; + +export const isTemplateEntity = ( + entity: Entity, +): entity is TemplateEntityV1beta3 => + entity.apiVersion === 'scaffolder.backstage.io/v1beta3' && + entity.kind === 'Template'; diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx index 1096553352..79e2648d2f 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx @@ -29,6 +29,7 @@ import { import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; import { viewTechDocRouteRef, selectedTemplateRouteRef } from '../../routes'; import { useNavigate } from 'react-router-dom'; +import { isTemplateEntity } from '../../lib/isTemplateEntity'; /** * @alpha @@ -87,11 +88,7 @@ export const TemplateGroups = (props: TemplateGroupsProps) => { <> {groups.map(({ title, filter }, index) => { const templates = entities - .filter( - (e): e is TemplateEntityV1beta3 => - e.kind === 'Template' && - e.apiVersion === 'scaffolder.backstage.io/v1beta3', - ) + .filter(isTemplateEntity) .filter(e => (templateFilter ? !templateFilter(e) : true)) .filter(filter) .map(template => {