diff --git a/.changeset/heavy-colts-wash.md b/.changeset/heavy-colts-wash.md new file mode 100644 index 0000000000..c22cb70dbf --- /dev/null +++ b/.changeset/heavy-colts-wash.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-common': patch +--- + +Export `typeguard` for `isTemplateEntityV1beta3` diff --git a/.changeset/swift-meals-live.md b/.changeset/swift-meals-live.md new file mode 100644 index 0000000000..ad8106b04e --- /dev/null +++ b/.changeset/swift-meals-live.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder': minor +--- + +Allow `TemplateListPage` and `TemplateWizardPage` to be passed in as props diff --git a/.changeset/weak-turtles-arrive.md b/.changeset/weak-turtles-arrive.md new file mode 100644 index 0000000000..3bb56909f9 --- /dev/null +++ b/.changeset/weak-turtles-arrive.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-react': minor +--- + +`scaffolder/next`: Export the `TemplateGroupFilter` and `TemplateGroups` and make an extensible component diff --git a/plugins/scaffolder-common/api-report.md b/plugins/scaffolder-common/api-report.md index 8864c0d76d..fb21ac450f 100644 --- a/plugins/scaffolder-common/api-report.md +++ b/plugins/scaffolder-common/api-report.md @@ -10,6 +10,11 @@ import type { JsonValue } from '@backstage/types'; import { KindValidator } from '@backstage/catalog-model'; import type { UserEntity } from '@backstage/catalog-model'; +// @public +export const isTemplateEntityV1beta3: ( + entity: Entity, +) => entity is TemplateEntityV1beta3; + // @public export type TaskSpec = TaskSpecV1beta3; diff --git a/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts b/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts index 8ded484ee2..aaba35911e 100644 --- a/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts +++ b/plugins/scaffolder-common/src/TemplateEntityV1beta3.ts @@ -86,3 +86,13 @@ export const templateEntityV1beta3Validator: KindValidator = { return validator(data) === data; }, }; + +/** + * Typeguard for filtering entities and ensuring v1beta3 entities + * @public + */ +export const isTemplateEntityV1beta3 = ( + entity: Entity, +): entity is TemplateEntityV1beta3 => + entity.apiVersion === 'scaffolder.backstage.io/v1beta3' && + entity.kind === 'Template'; diff --git a/plugins/scaffolder-common/src/index.ts b/plugins/scaffolder-common/src/index.ts index 521e678ab6..7f9792a1ba 100644 --- a/plugins/scaffolder-common/src/index.ts +++ b/plugins/scaffolder-common/src/index.ts @@ -21,5 +21,8 @@ */ export * from './TaskSpec'; -export { templateEntityV1beta3Validator } from './TemplateEntityV1beta3'; +export { + templateEntityV1beta3Validator, + isTemplateEntityV1beta3, +} from './TemplateEntityV1beta3'; export type { TemplateEntityV1beta3 } from './TemplateEntityV1beta3'; diff --git a/plugins/scaffolder-react/alpha-api-report.md b/plugins/scaffolder-react/alpha-api-report.md index c51f7ba518..319e3963f0 100644 --- a/plugins/scaffolder-react/alpha-api-report.md +++ b/plugins/scaffolder-react/alpha-api-report.md @@ -208,6 +208,12 @@ export const TemplateCategoryPicker: () => JSX.Element | null; // @alpha export const TemplateGroup: (props: TemplateGroupProps) => JSX.Element; +// @alpha (undocumented) +export type TemplateGroupFilter = { + title?: React_2.ReactNode; + filter: (entity: TemplateEntityV1beta3) => boolean; +}; + // @alpha export interface TemplateGroupProps { // (undocumented) @@ -229,6 +235,29 @@ export interface TemplateGroupProps { title: React_2.ReactNode; } +// @alpha (undocumented) +export const TemplateGroups: (props: TemplateGroupsProps) => JSX.Element | null; + +// @alpha (undocumented) +export interface TemplateGroupsProps { + // (undocumented) + additionalLinksForEntity?: (template: TemplateEntityV1beta3) => { + icon: IconComponent; + text: string; + url: string; + }[]; + // (undocumented) + groups: TemplateGroupFilter[]; + // (undocumented) + onTemplateSelected?: (template: TemplateEntityV1beta3) => void; + // (undocumented) + TemplateCardComponent?: React_2.ComponentType<{ + template: TemplateEntityV1beta3; + }>; + // (undocumented) + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; +} + // @alpha export const useFormDataFromQuery: ( initialState?: Record, diff --git a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx index af44085151..2a0a34823d 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCard/TemplateCard.tsx @@ -142,20 +142,22 @@ export const TemplateCard = (props: TemplateCardProps) => { - {props.additionalLinks?.map(({ icon, text, url }) => ( - + {props.additionalLinks?.map(({ icon, text, url }, index) => ( + ))} - {template.metadata.links?.map(({ url, icon, title }) => ( - - - - ))} + {template.metadata.links?.map( + ({ url, icon, title }, index) => ( + + + + ), + )} diff --git a/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.tsx b/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.tsx index 5d7021bc8c..028ce3a701 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateCategoryPicker/TemplateCategoryPicker.tsx @@ -37,7 +37,6 @@ const checkedIcon = ; /** * The Category Picker that is rendered on the left side for picking * categories and filtering the template list. - * * @alpha */ export const TemplateCategoryPicker = () => { diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx similarity index 90% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx rename to plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx index c0fb503d9b..c03af41f99 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.test.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.test.tsx @@ -28,7 +28,6 @@ import { TemplateGroups } from './TemplateGroups'; import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; import { errorApiRef } from '@backstage/core-plugin-api'; import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; -import { rootRouteRef } from '../../routes'; describe('TemplateGroups', () => { beforeEach(() => jest.clearAllMocks()); @@ -40,11 +39,6 @@ describe('TemplateGroups', () => { , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, ); expect(await findByTestId('progress')).toBeInTheDocument(); @@ -62,11 +56,6 @@ describe('TemplateGroups', () => { , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, ); expect(errorApi.post).toHaveBeenCalledWith(mockError); @@ -83,11 +72,6 @@ describe('TemplateGroups', () => { , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, ); expect(await findByText(/No templates found/)).toBeInTheDocument(); @@ -104,11 +88,6 @@ describe('TemplateGroups', () => { , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, ); expect(await findByText(/No templates found/)).toBeInTheDocument(); @@ -144,11 +123,6 @@ describe('TemplateGroups', () => { true }]} /> , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, ); expect(TemplateGroup).toHaveBeenCalledWith( @@ -193,11 +167,6 @@ describe('TemplateGroups', () => { groups={[{ title: 'all', filter: e => e.metadata.name === 't1' }]} /> , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, ); expect(TemplateGroup).toHaveBeenCalledWith( @@ -241,11 +210,6 @@ describe('TemplateGroups', () => { templateFilter={e => e.metadata.name === 't1'} /> , - { - mountedRoutes: { - '/create': rootRouteRef, - }, - }, ); expect(TemplateGroup).toHaveBeenCalledWith( diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx similarity index 63% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx rename to plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx index 79e2648d2f..50be7a4bdf 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx @@ -15,21 +15,15 @@ */ import React, { useCallback } from 'react'; -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'; -import { Typography } from '@material-ui/core'; import { - errorApiRef, - useApi, - useApp, - useRouteRef, -} from '@backstage/core-plugin-api'; + isTemplateEntityV1beta3, + TemplateEntityV1beta3, +} from '@backstage/plugin-scaffolder-common'; +import { Progress, Link } from '@backstage/core-components'; +import { Typography } from '@material-ui/core'; +import { errorApiRef, IconComponent, useApi } from '@backstage/core-plugin-api'; 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 @@ -39,28 +33,36 @@ export type TemplateGroupFilter = { filter: (entity: TemplateEntityV1beta3) => boolean; }; +/** + * @alpha + */ export interface TemplateGroupsProps { groups: TemplateGroupFilter[]; templateFilter?: (entity: TemplateEntityV1beta3) => boolean; TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; }>; + onTemplateSelected?: (template: TemplateEntityV1beta3) => void; + additionalLinksForEntity?: (template: TemplateEntityV1beta3) => { + icon: IconComponent; + text: string; + url: string; + }[]; } +/** + * @alpha + */ export const TemplateGroups = (props: TemplateGroupsProps) => { const { loading, error, entities } = useEntityList(); - const { groups, templateFilter, TemplateCardComponent } = props; + const { groups, templateFilter, TemplateCardComponent, onTemplateSelected } = + props; const errorApi = useApi(errorApiRef); - const app = useApp(); - const viewTechDocsLink = useRouteRef(viewTechDocRouteRef); - const templateRoute = useRouteRef(selectedTemplateRouteRef); - const navigate = useNavigate(); const onSelected = useCallback( (template: TemplateEntityV1beta3) => { - const { namespace, name } = parseEntityRef(stringifyEntityRef(template)); - navigate(templateRoute({ namespace, templateName: name })); + onTemplateSelected?.(template); }, - [navigate, templateRoute], + [onTemplateSelected], ); if (loading) { @@ -88,24 +90,12 @@ export const TemplateGroups = (props: TemplateGroupsProps) => { <> {groups.map(({ title, filter }, index) => { const templates = entities - .filter(isTemplateEntity) + .filter(isTemplateEntityV1beta3) .filter(e => (templateFilter ? !templateFilter(e) : true)) .filter(filter) .map(template => { - const { kind, namespace, name } = parseEntityRef( - stringifyEntityRef(template), - ); const additionalLinks = - template.metadata.annotations?.['backstage.io/techdocs-ref'] && - viewTechDocsLink - ? [ - { - icon: app.getSystemIcon('docs') ?? DocsIcon, - text: 'View TechDocs', - url: viewTechDocsLink({ kind, namespace, name }), - }, - ] - : []; + props.additionalLinksForEntity?.(template) ?? []; return { template, diff --git a/plugins/scaffolder/src/lib/isTemplateEntity.ts b/plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts similarity index 66% rename from plugins/scaffolder/src/lib/isTemplateEntity.ts rename to plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts index 61ceabaa53..765883916c 100644 --- a/plugins/scaffolder/src/lib/isTemplateEntity.ts +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts @@ -13,11 +13,4 @@ * 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'; +export * from './TemplateGroups'; diff --git a/plugins/scaffolder-react/src/next/components/index.ts b/plugins/scaffolder-react/src/next/components/index.ts index a38b0689d5..5bfa5ccdc8 100644 --- a/plugins/scaffolder-react/src/next/components/index.ts +++ b/plugins/scaffolder-react/src/next/components/index.ts @@ -17,6 +17,7 @@ export * from './Stepper'; export * from './TemplateCard'; export * from './ReviewState'; export * from './TemplateGroup'; +export * from './TemplateGroups'; export * from './Workflow'; export * from './TemplateOutputs'; export * from './Form'; diff --git a/plugins/scaffolder/alpha-api-report.md b/plugins/scaffolder/alpha-api-report.md index abb0dc9e03..6ceacdc008 100644 --- a/plugins/scaffolder/alpha-api-report.md +++ b/plugins/scaffolder/alpha-api-report.md @@ -7,10 +7,13 @@ import { FormProps as FormProps_2 } from '@backstage/plugin-scaffolder-react/alpha'; import type { FormProps as FormProps_3 } from '@rjsf/core-v5'; +import { LayoutOptions } from '@backstage/plugin-scaffolder-react'; +import { NextFieldExtensionOptions } from '@backstage/plugin-scaffolder-react/alpha'; import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; import { ScaffolderTaskOutput } from '@backstage/plugin-scaffolder-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react/alpha'; // @alpha @deprecated export type FormProps = Pick< @@ -28,6 +31,8 @@ export type NextRouterProps = { TemplateOutputsComponent?: React_2.ComponentType<{ output?: ScaffolderTaskOutput; }>; + TemplateListPageComponent?: React_2.ComponentType; + TemplateWizardPageComponent?: React_2.ComponentType; }; groups?: TemplateGroupFilter[]; templateFilter?: (entity: TemplateEntityV1beta3) => boolean; @@ -45,9 +50,24 @@ export const NextScaffolderPage: ( ) => JSX.Element; // @alpha (undocumented) -export type TemplateGroupFilter = { - title?: React_2.ReactNode; - filter: (entity: TemplateEntityV1beta3) => boolean; +export type TemplateListPageProps = { + TemplateCardComponent?: React_2.ComponentType<{ + template: TemplateEntityV1beta3; + }>; + groups?: TemplateGroupFilter[]; + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; + contextMenu?: { + editor?: boolean; + actions?: boolean; + tasks?: boolean; + }; +}; + +// @alpha (undocumented) +export type TemplateWizardPageProps = { + customFieldExtensions: NextFieldExtensionOptions[]; + layouts?: LayoutOptions[]; + FormProps?: FormProps_2; }; // (No @packageDocumentation comment for this package) diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/scaffolder/src/alpha.ts index 72eb073fba..d2bd762190 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/scaffolder/src/alpha.ts @@ -16,7 +16,8 @@ export { NextScaffolderPage } from './plugin'; export { - type TemplateGroupFilter, type NextRouterProps, type FormProps, + type TemplateListPageProps, + type TemplateWizardPageProps, } from './next'; diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx index 9aa0ec5eef..9a88050d74 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx @@ -16,7 +16,10 @@ import React, { ComponentType } from 'react'; import { Entity, stringifyEntityRef } from '@backstage/catalog-model'; -import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; +import { + isTemplateEntityV1beta3, + TemplateEntityV1beta3, +} from '@backstage/plugin-scaffolder-common'; import { Content, ContentHeader, @@ -28,7 +31,6 @@ import { import { useEntityList } from '@backstage/plugin-catalog-react'; import { Typography } from '@material-ui/core'; import { TemplateCard } from '../TemplateCard'; -import { isTemplateEntity } from '../../lib/isTemplateEntity'; /** * @internal @@ -54,7 +56,7 @@ export const TemplateList = ({ }: TemplateListProps) => { const { loading, error, entities } = useEntityList(); const Card = TemplateCardComponent || TemplateCard; - const templateEntities = entities.filter(isTemplateEntity); + const templateEntities = entities.filter(isTemplateEntityV1beta3); const maybeFilteredEntities = ( group ? templateEntities.filter(group.filter) : templateEntities ).filter(e => (templateFilter ? !templateFilter(e) : true)); diff --git a/plugins/scaffolder/src/next/Router/Router.test.tsx b/plugins/scaffolder/src/next/Router/Router.test.tsx index 9565572a2f..3d52dd0dd0 100644 --- a/plugins/scaffolder/src/next/Router/Router.test.tsx +++ b/plugins/scaffolder/src/next/Router/Router.test.tsx @@ -47,6 +47,21 @@ describe('Router', () => { expect(TemplateListPage).toHaveBeenCalled(); }); + + it('should render user-provided TemplateListPage', async () => { + const { getByText } = await renderInTestApp( + <>foobar, + }} + />, + { + routeEntries: ['/'], + }, + ); + expect(getByText('foobar')).toBeInTheDocument(); + expect(TemplateListPage).not.toHaveBeenCalled(); + }); }); describe('/templates/:templateName', () => { @@ -58,6 +73,21 @@ describe('Router', () => { expect(TemplateWizardPage).toHaveBeenCalled(); }); + it('should render user-provided TemplateWizardPage', async () => { + const { getByText } = await renderInTestApp( + <>foobar, + }} + />, + { + routeEntries: ['/templates/default/foo'], + }, + ); + expect(getByText('foobar')).toBeInTheDocument(); + expect(TemplateWizardPage).not.toHaveBeenCalled(); + }); + it('should pass through the FormProps property', async () => { const transformErrorsMock = jest.fn(); diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 75d87602e4..9c50d0d979 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -15,11 +15,15 @@ */ import React, { PropsWithChildren } from 'react'; import { Routes, Route, useOutlet } from 'react-router-dom'; -import { TemplateListPage } from '../TemplateListPage'; -import { TemplateWizardPage } from '../TemplateWizardPage'; +import { TemplateListPage, TemplateListPageProps } from '../TemplateListPage'; +import { + TemplateWizardPage, + TemplateWizardPageProps, +} from '../TemplateWizardPage'; import { NextFieldExtensionOptions, FormProps, + TemplateGroupFilter, } from '@backstage/plugin-scaffolder-react/alpha'; import { ScaffolderTaskOutput, @@ -29,7 +33,6 @@ import { } from '@backstage/plugin-scaffolder-react'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { TemplateGroupFilter } from '../TemplateListPage'; import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default'; import { @@ -59,6 +62,8 @@ export type NextRouterProps = { TemplateOutputsComponent?: React.ComponentType<{ output?: ScaffolderTaskOutput; }>; + TemplateListPageComponent?: React.ComponentType; + TemplateWizardPageComponent?: React.ComponentType; }; groups?: TemplateGroupFilter[]; templateFilter?: (entity: TemplateEntityV1beta3) => boolean; @@ -85,6 +90,8 @@ export const Router = (props: PropsWithChildren) => { TemplateCardComponent, TemplateOutputsComponent, TaskPageComponent = OngoingTask, + TemplateListPageComponent = TemplateListPage, + TemplateWizardPageComponent = TemplateWizardPage, } = {}, } = props; const outlet = useOutlet() || props.children; @@ -108,7 +115,7 @@ export const Router = (props: PropsWithChildren) => { ) => { path={selectedTemplateRouteRef.path} element={ - { const registerComponentLink = useRouteRef(registerComponentRouteRef); const { @@ -87,6 +98,9 @@ export const TemplateListPage = (props: TemplateListPageProps) => { const editorLink = useRouteRef(editRouteRef); const actionsLink = useRouteRef(actionsRouteRef); const tasksLink = useRouteRef(scaffolderListTaskRouteRef); + const viewTechDocsLink = useRouteRef(viewTechDocRouteRef); + const templateRoute = useRouteRef(selectedTemplateRouteRef); + const app = useApp(); const groups = givenGroups.length ? createGroupsWithOther(givenGroups) @@ -107,6 +121,34 @@ export const TemplateListPage = (props: TemplateListPageProps) => { : undefined, }; + const additionalLinksForEntity = useCallback( + (template: TemplateEntityV1beta3) => { + const { kind, namespace, name } = parseEntityRef( + stringifyEntityRef(template), + ); + return template.metadata.annotations?.['backstage.io/techdocs-ref'] && + viewTechDocsLink + ? [ + { + icon: app.getSystemIcon('docs') ?? DocsIcon, + text: 'View TechDocs', + url: viewTechDocsLink({ kind, namespace, name }), + }, + ] + : []; + }, + [app, viewTechDocsLink], + ); + + const onTemplateSelected = useCallback( + (template: TemplateEntityV1beta3) => { + const { namespace, name } = parseEntityRef(stringifyEntityRef(template)); + + navigate(templateRoute({ namespace, templateName: name })); + }, + [navigate, templateRoute], + ); + return ( @@ -146,6 +188,8 @@ export const TemplateListPage = (props: TemplateListPageProps) => { groups={groups} templateFilter={templateFilter} TemplateCardComponent={TemplateCardComponent} + onTemplateSelected={onTemplateSelected} + additionalLinksForEntity={additionalLinksForEntity} /> diff --git a/plugins/scaffolder/src/next/TemplateListPage/index.ts b/plugins/scaffolder/src/next/TemplateListPage/index.ts index 0436cfeeeb..c404a9352a 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 } from './TemplateGroups'; +export type { TemplateListPageProps } from './TemplateListPage'; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx index 99f4a3b52d..a7133ae8c7 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx +++ b/plugins/scaffolder/src/next/TemplateWizardPage/TemplateWizardPage.tsx @@ -41,6 +41,9 @@ import { selectedTemplateRouteRef, } from '../../routes'; +/** + * @alpha + */ export type TemplateWizardPageProps = { customFieldExtensions: NextFieldExtensionOptions[]; layouts?: LayoutOptions[]; diff --git a/plugins/scaffolder/src/next/TemplateWizardPage/index.ts b/plugins/scaffolder/src/next/TemplateWizardPage/index.ts index 146a7a9afc..991b754ec9 100644 --- a/plugins/scaffolder/src/next/TemplateWizardPage/index.ts +++ b/plugins/scaffolder/src/next/TemplateWizardPage/index.ts @@ -14,3 +14,4 @@ * limitations under the License. */ export { TemplateWizardPage } from './TemplateWizardPage'; +export type { TemplateWizardPageProps } from './TemplateWizardPage';