diff --git a/plugins/scaffolder/alpha-api-report.md b/plugins/scaffolder/alpha-api-report.md index 58d70e3c71..abb0dc9e03 100644 --- a/plugins/scaffolder/alpha-api-report.md +++ b/plugins/scaffolder/alpha-api-report.md @@ -5,7 +5,6 @@ ```ts /// -import { Entity } from '@backstage/catalog-model'; import { FormProps as FormProps_2 } from '@backstage/plugin-scaffolder-react/alpha'; import type { FormProps as FormProps_3 } from '@rjsf/core-v5'; import { PropsWithChildren } from 'react'; @@ -31,7 +30,7 @@ export type NextRouterProps = { }>; }; groups?: TemplateGroupFilter[]; - templateFilter?: TemplateFilter; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; FormProps?: FormProps_2; contextMenu?: { editor?: boolean; @@ -45,13 +44,10 @@ export const NextScaffolderPage: ( props: PropsWithChildren, ) => JSX.Element; -// @alpha (undocumented) -export type TemplateFilter = (entity: Entity) => boolean; - // @alpha (undocumented) export type TemplateGroupFilter = { title?: React_2.ReactNode; - filter: (entity: Entity) => boolean; + filter: (entity: TemplateEntityV1beta3) => boolean; }; // (No @packageDocumentation comment for this package) diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 3865a2517d..7173bbd3e6 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -332,7 +332,7 @@ export type RouterProps = { title?: React_2.ReactNode; filter: (entity: Entity) => boolean; }>; - templateFilter?: (entity: Entity) => boolean; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; defaultPreviewTemplate?: string; headerOptions?: { pageTitleOverride?: string; diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/scaffolder/src/alpha.ts index e1c2260acb..72eb073fba 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/scaffolder/src/alpha.ts @@ -17,7 +17,6 @@ export { NextScaffolderPage } from './plugin'; export { type TemplateGroupFilter, - type TemplateFilter, type NextRouterProps, type FormProps, } from './next'; diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index b84fb664bc..05d5cc9f0a 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -58,7 +58,7 @@ export type RouterProps = { title?: React.ReactNode; filter: (entity: Entity) => boolean; }>; - templateFilter?: (entity: Entity) => boolean; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; defaultPreviewTemplate?: string; headerOptions?: { pageTitleOverride?: string; diff --git a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx index b56ebd83af..40435573e9 100644 --- a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx +++ b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx @@ -22,7 +22,6 @@ import { Page, SupportButton, } from '@backstage/core-components'; -import { Entity } from '@backstage/catalog-model'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { useRouteRef } from '@backstage/core-plugin-api'; import { @@ -47,9 +46,9 @@ export type ScaffolderPageProps = { | undefined; groups?: Array<{ title?: React.ReactNode; - filter: (entity: Entity) => boolean; + filter: (entity: TemplateEntityV1beta3) => boolean; }>; - templateFilter?: (entity: Entity) => boolean; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; contextMenu?: { editor?: boolean; actions?: boolean; @@ -72,7 +71,7 @@ export const ScaffolderPageContents = ({ const registerComponentLink = useRouteRef(registerComponentRouteRef); const otherTemplatesGroup = { title: groups ? 'Other Templates' : 'Templates', - filter: (entity: Entity) => { + filter: (entity: TemplateEntityV1beta3) => { const filtered = (groups ?? []).map(group => group.filter(entity)); return !filtered.some(result => result === true); }, diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx index 190c0cd0ac..cf1ee66810 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx @@ -38,9 +38,9 @@ export type TemplateListProps = { | undefined; group?: { title?: React.ReactNode; - filter: (entity: Entity) => boolean; + filter: (entity: TemplateEntityV1beta3) => boolean; }; - templateFilter?: (entity: Entity) => boolean; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; }; /** @@ -54,8 +54,22 @@ export const TemplateList = ({ const { loading, error, entities } = useEntityList(); const Card = TemplateCardComponent || TemplateCard; const maybeFilteredEntities = ( - group ? entities.filter(e => group.filter(e)) : entities - ).filter(e => (templateFilter ? !templateFilter(e) : true)); + 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)); const titleComponent: React.ReactNode = (() => { if (group && group.title) { diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 167801c255..75d87602e4 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -29,7 +29,7 @@ import { } from '@backstage/plugin-scaffolder-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { TemplateGroupFilter, TemplateFilter } from '../TemplateListPage'; +import { TemplateGroupFilter } from '../TemplateListPage'; import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; import { @@ -61,7 +61,7 @@ export type NextRouterProps = { }>; }; groups?: TemplateGroupFilter[]; - templateFilter?: TemplateFilter; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; // todo(blam): rename this to formProps FormProps?: FormProps; contextMenu?: { diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx index decfeee470..1096553352 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx @@ -15,11 +15,7 @@ */ import React, { useCallback } from 'react'; -import { - Entity, - parseEntityRef, - stringifyEntityRef, -} from '@backstage/catalog-model'; +import { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model'; import { useEntityList } from '@backstage/plugin-catalog-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; import { Progress, Link, DocsIcon } from '@backstage/core-components'; @@ -34,22 +30,17 @@ import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; import { viewTechDocRouteRef, selectedTemplateRouteRef } from '../../routes'; import { useNavigate } from 'react-router-dom'; -/** - * @alpha - */ -export type TemplateFilter = (entity: Entity) => boolean; - /** * @alpha */ export type TemplateGroupFilter = { title?: React.ReactNode; - filter: (entity: Entity) => boolean; + filter: (entity: TemplateEntityV1beta3) => boolean; }; export interface TemplateGroupsProps { groups: TemplateGroupFilter[]; - templateFilter?: TemplateFilter; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; }>; @@ -96,8 +87,13 @@ 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(e => (templateFilter ? !templateFilter(e) : true)) - .filter((e): e is TemplateEntityV1beta3 => filter(e)) + .filter(filter) .map(template => { const { kind, namespace, name } = parseEntityRef( stringifyEntityRef(template), diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx index 3f81188e06..0af20db6c9 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx @@ -35,11 +35,7 @@ import { import { CategoryPicker } from './CategoryPicker'; import { RegisterExistingButton } from './RegisterExistingButton'; import { useRouteRef } from '@backstage/core-plugin-api'; -import { - TemplateGroupFilter, - TemplateGroups, - TemplateFilter, -} from './TemplateGroups'; +import { TemplateGroupFilter, TemplateGroups } from './TemplateGroups'; import { registerComponentRouteRef } from '../../routes'; import { ContextMenu } from './ContextMenu'; @@ -48,7 +44,7 @@ export type TemplateListPageProps = { template: TemplateEntityV1beta3; }>; groups?: TemplateGroupFilter[]; - templateFilter?: TemplateFilter; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; contextMenu?: { editor?: boolean; actions?: boolean; diff --git a/plugins/scaffolder/src/next/TemplateListPage/index.ts b/plugins/scaffolder/src/next/TemplateListPage/index.ts index a974052730..0436cfeeeb 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/index.ts +++ b/plugins/scaffolder/src/next/TemplateListPage/index.ts @@ -14,4 +14,4 @@ * limitations under the License. */ export { TemplateListPage } from './TemplateListPage'; -export type { TemplateGroupFilter, TemplateFilter } from './TemplateGroups'; +export type { TemplateGroupFilter } from './TemplateGroups';