From a02490f2767750035a5fc5805a2666506429a5fe Mon Sep 17 00:00:00 2001 From: Min Kim Date: Thu, 16 Mar 2023 10:53:32 -0400 Subject: [PATCH 01/14] Export TemplateListPageProps for the router to accept component as prop Signed-off-by: Min Kim Co-authored-by: Taras Mankovski --- plugins/scaffolder/src/next/Router/Router.tsx | 6 ++++-- plugins/scaffolder/src/next/TemplateListPage/index.ts | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index 75d87602e4..a1cace928f 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -15,7 +15,7 @@ */ import React, { PropsWithChildren } from 'react'; import { Routes, Route, useOutlet } from 'react-router-dom'; -import { TemplateListPage } from '../TemplateListPage'; +import { TemplateListPage, TemplateListPageProps } from '../TemplateListPage'; import { TemplateWizardPage } from '../TemplateWizardPage'; import { NextFieldExtensionOptions, @@ -59,6 +59,7 @@ export type NextRouterProps = { TemplateOutputsComponent?: React.ComponentType<{ output?: ScaffolderTaskOutput; }>; + TemplateListPageComponent?: React.ComponentType; }; groups?: TemplateGroupFilter[]; templateFilter?: (entity: TemplateEntityV1beta3) => boolean; @@ -85,6 +86,7 @@ export const Router = (props: PropsWithChildren) => { TemplateCardComponent, TemplateOutputsComponent, TaskPageComponent = OngoingTask, + TemplateListPageComponent = TemplateListPage, } = {}, } = props; const outlet = useOutlet() || props.children; @@ -108,7 +110,7 @@ export const Router = (props: PropsWithChildren) => { Date: Thu, 16 Mar 2023 10:54:53 -0400 Subject: [PATCH 02/14] Export necessary components for a custom TemplateListPage Signed-off-by: Min Kim Co-authored-by: Taras Mankovski --- plugins/scaffolder/src/alpha.ts | 7 +++++++ .../scaffolder/src/next/TemplateListPage/index.ts | 13 +++++++++++++ 2 files changed, 20 insertions(+) diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/scaffolder/src/alpha.ts index 72eb073fba..b2eac4a0c8 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/scaffolder/src/alpha.ts @@ -16,7 +16,14 @@ export { NextScaffolderPage } from './plugin'; export { + TemplateGroups, type TemplateGroupFilter, + type TemplateGroupsProps, type NextRouterProps, type FormProps, + CategoryPicker, + RegisterExistingButton, + type RegisterExistingButtonProps, + ContextMenu, } from './next'; +export { registerComponentRouteRef } from './routes'; diff --git a/plugins/scaffolder/src/next/TemplateListPage/index.ts b/plugins/scaffolder/src/next/TemplateListPage/index.ts index c404a9352a..74efbef813 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/index.ts +++ b/plugins/scaffolder/src/next/TemplateListPage/index.ts @@ -15,3 +15,16 @@ */ export { TemplateListPage } from './TemplateListPage'; export type { TemplateListPageProps } from './TemplateListPage'; + +export { TemplateGroups } from './TemplateGroups'; +export type { + TemplateGroupFilter, + TemplateGroupsProps, +} from './TemplateGroups'; + +export { CategoryPicker } from './CategoryPicker'; + +export { RegisterExistingButton } from './RegisterExistingButton'; +export type { RegisterExistingButtonProps } from './RegisterExistingButton'; + +export { ContextMenu } from './ContextMenu'; From 001a6e61b46a1198b8e1f23116e62fa9b81e7aa9 Mon Sep 17 00:00:00 2001 From: Min Kim Date: Thu, 16 Mar 2023 11:26:32 -0400 Subject: [PATCH 03/14] Export TemplateWizardPageProps for the router to accept page as prop Signed-off-by: Min Kim Co-authored-by: Taras Mankovski --- plugins/scaffolder/src/next/Router/Router.tsx | 9 +++++++-- plugins/scaffolder/src/next/TemplateWizardPage/index.ts | 1 + 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index a1cace928f..e36bc7428a 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -16,7 +16,10 @@ import React, { PropsWithChildren } from 'react'; import { Routes, Route, useOutlet } from 'react-router-dom'; import { TemplateListPage, TemplateListPageProps } from '../TemplateListPage'; -import { TemplateWizardPage } from '../TemplateWizardPage'; +import { + TemplateWizardPage, + TemplateWizardPageProps, +} from '../TemplateWizardPage'; import { NextFieldExtensionOptions, FormProps, @@ -60,6 +63,7 @@ export type NextRouterProps = { output?: ScaffolderTaskOutput; }>; TemplateListPageComponent?: React.ComponentType; + TemplateWizardPageComponent?: React.ComponentType; }; groups?: TemplateGroupFilter[]; templateFilter?: (entity: TemplateEntityV1beta3) => boolean; @@ -87,6 +91,7 @@ export const Router = (props: PropsWithChildren) => { TemplateOutputsComponent, TaskPageComponent = OngoingTask, TemplateListPageComponent = TemplateListPage, + TemplateWizardPageComponent = TemplateWizardPage, } = {}, } = props; const outlet = useOutlet() || props.children; @@ -122,7 +127,7 @@ export const Router = (props: PropsWithChildren) => { path={selectedTemplateRouteRef.path} element={ - Date: Thu, 16 Mar 2023 11:46:42 -0400 Subject: [PATCH 04/14] Write tests for custom Wizard and List pages Signed-off-by: Min Kim Co-authored-by: Taras Mankovski --- .../src/next/Router/Router.test.tsx | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) 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(); From e5ad1bd61eca6ca988569422338794a65f254ca8 Mon Sep 17 00:00:00 2001 From: Min Kim Date: Thu, 16 Mar 2023 13:04:08 -0400 Subject: [PATCH 05/14] Add changesets and the new api report Signed-off-by: Min Kim Co-authored-by: Taras Mankovski --- .changeset/swift-meals-live.md | 5 ++ .../TemplateCategoryPicker.tsx | 1 - plugins/scaffolder/alpha-api-report.md | 55 +++++++++++++++++++ plugins/scaffolder/api-report.md | 8 +-- plugins/scaffolder/src/alpha.ts | 4 +- .../next/TemplateListPage/TemplateGroups.tsx | 6 ++ .../TemplateListPage/TemplateListPage.tsx | 6 ++ .../src/next/TemplateListPage/index.ts | 4 -- .../TemplateWizardPage/TemplateWizardPage.tsx | 3 + plugins/scaffolder/src/routes.ts | 3 + 10 files changed, 84 insertions(+), 11 deletions(-) create mode 100644 .changeset/swift-meals-live.md 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/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/alpha-api-report.md b/plugins/scaffolder/alpha-api-report.md index abb0dc9e03..656f79811f 100644 --- a/plugins/scaffolder/alpha-api-report.md +++ b/plugins/scaffolder/alpha-api-report.md @@ -5,8 +5,12 @@ ```ts /// +import { ExternalRouteRef } from '@backstage/core-plugin-api'; 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 { LinkProps } from 'react-router-dom'; +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'; @@ -28,6 +32,8 @@ export type NextRouterProps = { TemplateOutputsComponent?: React_2.ComponentType<{ output?: ScaffolderTaskOutput; }>; + TemplateListPageComponent?: React_2.ComponentType; + TemplateWizardPageComponent?: React_2.ComponentType; }; groups?: TemplateGroupFilter[]; templateFilter?: (entity: TemplateEntityV1beta3) => boolean; @@ -44,11 +50,60 @@ export const NextScaffolderPage: ( props: PropsWithChildren, ) => JSX.Element; +// @public (undocumented) +export const registerComponentRouteRef: ExternalRouteRef; + +// @alpha +export const RegisterExistingButton: ( + props: RegisterExistingButtonProps, +) => JSX.Element | null; + +// @alpha +export type RegisterExistingButtonProps = { + title: string; +} & Partial>; + // @alpha (undocumented) export type TemplateGroupFilter = { title?: React_2.ReactNode; filter: (entity: TemplateEntityV1beta3) => boolean; }; +// @alpha (undocumented) +export const TemplateGroups: (props: TemplateGroupsProps) => JSX.Element | null; + +// @alpha (undocumented) +export interface TemplateGroupsProps { + // (undocumented) + groups: TemplateGroupFilter[]; + // (undocumented) + TemplateCardComponent?: React_2.ComponentType<{ + template: TemplateEntityV1beta3; + }>; + // (undocumented) + templateFilter?: (entity: TemplateEntityV1beta3) => boolean; +} + +// @alpha (undocumented) +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/api-report.md b/plugins/scaffolder/api-report.md index 8f37f7cf50..5b8ea034cc 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -138,8 +138,8 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< string[], { showCounts?: boolean | undefined; - kinds?: string[] | undefined; helperText?: string | undefined; + kinds?: string[] | undefined; } >; @@ -148,8 +148,8 @@ export const EntityTagsPickerFieldSchema: FieldSchema< string[], { showCounts?: boolean | undefined; - kinds?: string[] | undefined; helperText?: string | undefined; + kinds?: string[] | undefined; } >; @@ -315,8 +315,8 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< | { azure?: string[] | undefined; github?: string[] | undefined; - gitlab?: string[] | undefined; bitbucket?: string[] | undefined; + gitlab?: string[] | undefined; gerrit?: string[] | undefined; } | undefined; @@ -341,8 +341,8 @@ export const RepoUrlPickerFieldSchema: FieldSchema< | { azure?: string[] | undefined; github?: string[] | undefined; - gitlab?: string[] | undefined; bitbucket?: string[] | undefined; + gitlab?: string[] | undefined; gerrit?: string[] | undefined; } | undefined; diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/scaffolder/src/alpha.ts index b2eac4a0c8..c082878827 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/scaffolder/src/alpha.ts @@ -21,9 +21,9 @@ export { type TemplateGroupsProps, type NextRouterProps, type FormProps, - CategoryPicker, RegisterExistingButton, type RegisterExistingButtonProps, - ContextMenu, + type TemplateListPageProps, + type TemplateWizardPageProps, } from './next'; export { registerComponentRouteRef } from './routes'; diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx index 79e2648d2f..8d4b3f8470 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx @@ -39,6 +39,9 @@ export type TemplateGroupFilter = { filter: (entity: TemplateEntityV1beta3) => boolean; }; +/** + * @alpha + */ export interface TemplateGroupsProps { groups: TemplateGroupFilter[]; templateFilter?: (entity: TemplateEntityV1beta3) => boolean; @@ -47,6 +50,9 @@ export interface TemplateGroupsProps { }>; } +/** + * @alpha + */ export const TemplateGroups = (props: TemplateGroupsProps) => { const { loading, error, entities } = useEntityList(); const { groups, templateFilter, TemplateCardComponent } = props; diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx index 424293665b..60a932c06d 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx @@ -48,6 +48,9 @@ import { scaffolderListTaskRouteRef, } from '../../routes'; +/** + * @alpha + */ export type TemplateListPageProps = { TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; @@ -76,6 +79,9 @@ const createGroupsWithOther = ( }, ]; +/** + * @alpha + */ export const TemplateListPage = (props: TemplateListPageProps) => { const registerComponentLink = useRouteRef(registerComponentRouteRef); const { diff --git a/plugins/scaffolder/src/next/TemplateListPage/index.ts b/plugins/scaffolder/src/next/TemplateListPage/index.ts index 74efbef813..bca2e24cb3 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/index.ts +++ b/plugins/scaffolder/src/next/TemplateListPage/index.ts @@ -22,9 +22,5 @@ export type { TemplateGroupsProps, } from './TemplateGroups'; -export { CategoryPicker } from './CategoryPicker'; - export { RegisterExistingButton } from './RegisterExistingButton'; export type { RegisterExistingButtonProps } from './RegisterExistingButton'; - -export { ContextMenu } from './ContextMenu'; 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/routes.ts b/plugins/scaffolder/src/routes.ts index 54b7605eb1..cc197fc60b 100644 --- a/plugins/scaffolder/src/routes.ts +++ b/plugins/scaffolder/src/routes.ts @@ -19,6 +19,9 @@ import { createSubRouteRef, } from '@backstage/core-plugin-api'; +/** + * @public + */ export const registerComponentRouteRef = createExternalRouteRef({ id: 'register-component', optional: true, From 26aea4ddc235fdc93718490c209926e1e963edbd Mon Sep 17 00:00:00 2001 From: Min Kim Date: Fri, 17 Mar 2023 16:33:28 -0400 Subject: [PATCH 06/14] Do not export `registerComponentRouteRef` and `RegisterExistingButton` Signed-off-by: Min Kim --- plugins/scaffolder/src/alpha.ts | 3 --- plugins/scaffolder/src/next/TemplateListPage/index.ts | 3 --- plugins/scaffolder/src/routes.ts | 3 --- 3 files changed, 9 deletions(-) diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/scaffolder/src/alpha.ts index c082878827..90b0680d27 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/scaffolder/src/alpha.ts @@ -21,9 +21,6 @@ export { type TemplateGroupsProps, type NextRouterProps, type FormProps, - RegisterExistingButton, - type RegisterExistingButtonProps, type TemplateListPageProps, type TemplateWizardPageProps, } from './next'; -export { registerComponentRouteRef } from './routes'; diff --git a/plugins/scaffolder/src/next/TemplateListPage/index.ts b/plugins/scaffolder/src/next/TemplateListPage/index.ts index bca2e24cb3..e0eb0bb021 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/index.ts +++ b/plugins/scaffolder/src/next/TemplateListPage/index.ts @@ -21,6 +21,3 @@ export type { TemplateGroupFilter, TemplateGroupsProps, } from './TemplateGroups'; - -export { RegisterExistingButton } from './RegisterExistingButton'; -export type { RegisterExistingButtonProps } from './RegisterExistingButton'; diff --git a/plugins/scaffolder/src/routes.ts b/plugins/scaffolder/src/routes.ts index cc197fc60b..54b7605eb1 100644 --- a/plugins/scaffolder/src/routes.ts +++ b/plugins/scaffolder/src/routes.ts @@ -19,9 +19,6 @@ import { createSubRouteRef, } from '@backstage/core-plugin-api'; -/** - * @public - */ export const registerComponentRouteRef = createExternalRouteRef({ id: 'register-component', optional: true, From c9461071fc3c0c3d8a8ef701c5167db6d9e5ba66 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Mar 2023 08:56:18 +0100 Subject: [PATCH 07/14] chore: fixing api-reports Signed-off-by: blam --- plugins/scaffolder/alpha-api-report.md | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/plugins/scaffolder/alpha-api-report.md b/plugins/scaffolder/alpha-api-report.md index 656f79811f..d0bb627d4d 100644 --- a/plugins/scaffolder/alpha-api-report.md +++ b/plugins/scaffolder/alpha-api-report.md @@ -5,11 +5,9 @@ ```ts /// -import { ExternalRouteRef } from '@backstage/core-plugin-api'; 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 { LinkProps } from 'react-router-dom'; import { NextFieldExtensionOptions } from '@backstage/plugin-scaffolder-react/alpha'; import { PropsWithChildren } from 'react'; import { default as React_2 } from 'react'; @@ -50,19 +48,6 @@ export const NextScaffolderPage: ( props: PropsWithChildren, ) => JSX.Element; -// @public (undocumented) -export const registerComponentRouteRef: ExternalRouteRef; - -// @alpha -export const RegisterExistingButton: ( - props: RegisterExistingButtonProps, -) => JSX.Element | null; - -// @alpha -export type RegisterExistingButtonProps = { - title: string; -} & Partial>; - // @alpha (undocumented) export type TemplateGroupFilter = { title?: React_2.ReactNode; From 2bc8050b151b42b0f685a13a5b176a918cad0fd4 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Mar 2023 09:10:30 +0100 Subject: [PATCH 08/14] chore: export typegurad from common instead Signed-off-by: blam --- plugins/scaffolder-common/src/TemplateEntityV1beta3.ts | 10 ++++++++++ plugins/scaffolder-common/src/index.ts | 5 ++++- 2 files changed, 14 insertions(+), 1 deletion(-) 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'; From 57fb2aecbc9aa8a16361d46326ab7e8474c8d293 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Mar 2023 09:11:21 +0100 Subject: [PATCH 09/14] chore: move template groups to react instead Signed-off-by: blam --- .../TemplateGroups}/TemplateGroups.test.tsx | 36 --------------- .../TemplateGroups}/TemplateGroups.tsx | 45 +++++++++---------- .../next/components/TemplateGroups/index.ts | 16 +++++++ 3 files changed, 37 insertions(+), 60 deletions(-) rename plugins/{scaffolder/src/next/TemplateListPage => scaffolder-react/src/next/components/TemplateGroups}/TemplateGroups.test.tsx (90%) rename plugins/{scaffolder/src/next/TemplateListPage => scaffolder-react/src/next/components/TemplateGroups}/TemplateGroups.tsx (72%) create mode 100644 plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts 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 72% rename from plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx rename to plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx index 8d4b3f8470..ccf12b9309 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateGroups.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx @@ -17,19 +17,22 @@ 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 { + isTemplateEntityV1beta3, + TemplateEntityV1beta3, +} from '@backstage/plugin-scaffolder-common'; import { Progress, Link, DocsIcon } from '@backstage/core-components'; import { Typography } from '@material-ui/core'; import { errorApiRef, + IconComponent, useApi, useApp, useRouteRef, } from '@backstage/core-plugin-api'; import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; -import { viewTechDocRouteRef, selectedTemplateRouteRef } from '../../routes'; +import { viewTechDocRouteRef } from '../../routes'; import { useNavigate } from 'react-router-dom'; -import { isTemplateEntity } from '../../lib/isTemplateEntity'; /** * @alpha @@ -48,6 +51,15 @@ export interface TemplateGroupsProps { TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; }>; + onTemplateSelected?: (template: { + namespace: string; + templateName: string; + }) => void; + additionalLinksForEntity?: (template: TemplateEntityV1beta3) => { + icon: IconComponent; + text: string; + url: string; + }[]; } /** @@ -55,18 +67,15 @@ export interface TemplateGroupsProps { */ 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?.({ namespace, templateName: name }); }, - [navigate, templateRoute], + [onTemplateSelected], ); if (loading) { @@ -94,24 +103,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-react/src/next/components/TemplateGroups/index.ts b/plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts new file mode 100644 index 0000000000..765883916c --- /dev/null +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/index.ts @@ -0,0 +1,16 @@ +/* + * 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. + */ +export * from './TemplateGroups'; From 5765e4e4df121869dadd5783519c9fd9629cb981 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Mar 2023 09:26:19 +0100 Subject: [PATCH 10/14] chore: reworking the TemplatePage to use the new one from -react Signed-off-by: blam --- .../components/TemplateCard/TemplateCard.tsx | 24 +++++----- .../TemplateGroups/TemplateGroups.tsx | 20 ++------ .../src/next/components/index.ts | 1 + .../TemplateListPage/TemplateListPage.tsx | 46 +++++++++++++++++-- .../src/next/TemplateListPage/index.ts | 6 --- 5 files changed, 61 insertions(+), 36 deletions(-) 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/TemplateGroups/TemplateGroups.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx index ccf12b9309..58e5e36173 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx @@ -21,18 +21,10 @@ import { isTemplateEntityV1beta3, TemplateEntityV1beta3, } from '@backstage/plugin-scaffolder-common'; -import { Progress, Link, DocsIcon } from '@backstage/core-components'; +import { Progress, Link } from '@backstage/core-components'; import { Typography } from '@material-ui/core'; -import { - errorApiRef, - IconComponent, - useApi, - useApp, - useRouteRef, -} from '@backstage/core-plugin-api'; +import { errorApiRef, IconComponent, useApi } from '@backstage/core-plugin-api'; import { TemplateGroup } from '@backstage/plugin-scaffolder-react/alpha'; -import { viewTechDocRouteRef } from '../../routes'; -import { useNavigate } from 'react-router-dom'; /** * @alpha @@ -51,10 +43,7 @@ export interface TemplateGroupsProps { TemplateCardComponent?: React.ComponentType<{ template: TemplateEntityV1beta3; }>; - onTemplateSelected?: (template: { - namespace: string; - templateName: string; - }) => void; + onTemplateSelected?: (template: TemplateEntityV1beta3) => void; additionalLinksForEntity?: (template: TemplateEntityV1beta3) => { icon: IconComponent; text: string; @@ -72,8 +61,7 @@ export const TemplateGroups = (props: TemplateGroupsProps) => { const errorApi = useApi(errorApiRef); const onSelected = useCallback( (template: TemplateEntityV1beta3) => { - const { namespace, name } = parseEntityRef(stringifyEntityRef(template)); - onTemplateSelected?.({ namespace, templateName: name }); + onTemplateSelected?.(template); }, [onTemplateSelected], ); 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/src/next/TemplateListPage/TemplateListPage.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx index 60a932c06d..b1d7a66a94 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx @@ -14,14 +14,15 @@ * limitations under the License. */ -import React from 'react'; +import React, { useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common'; -import { useRouteRef } from '@backstage/core-plugin-api'; +import { useApp, useRouteRef } from '@backstage/core-plugin-api'; import { Content, ContentHeader, + DocsIcon, Header, Page, SupportButton, @@ -40,13 +41,19 @@ import { } from '@backstage/plugin-scaffolder-react/alpha'; import { RegisterExistingButton } from './RegisterExistingButton'; -import { TemplateGroupFilter, TemplateGroups } from './TemplateGroups'; +import { + TemplateGroupFilter, + TemplateGroups, +} from '@backstage/plugin-scaffolder-react/alpha'; import { actionsRouteRef, editRouteRef, registerComponentRouteRef, scaffolderListTaskRouteRef, + selectedTemplateRouteRef, + viewTechDocRouteRef, } from '../../routes'; +import { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model'; /** * @alpha @@ -93,6 +100,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) @@ -113,6 +123,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 ( @@ -152,6 +190,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 e0eb0bb021..c404a9352a 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/index.ts +++ b/plugins/scaffolder/src/next/TemplateListPage/index.ts @@ -15,9 +15,3 @@ */ export { TemplateListPage } from './TemplateListPage'; export type { TemplateListPageProps } from './TemplateListPage'; - -export { TemplateGroups } from './TemplateGroups'; -export type { - TemplateGroupFilter, - TemplateGroupsProps, -} from './TemplateGroups'; From 50c480ae18e4ea74160ce4b93a66dd61ccaae6e8 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Mar 2023 09:31:16 +0100 Subject: [PATCH 11/14] chore: fix typescript and updating api-reports Signed-off-by: blam --- plugins/scaffolder-common/api-report.md | 5 ++++ plugins/scaffolder-react/alpha-api-report.md | 29 +++++++++++++++++++ .../TemplateGroups/TemplateGroups.tsx | 1 - plugins/scaffolder/alpha-api-report.md | 22 +------------- plugins/scaffolder/api-report.md | 8 ++--- plugins/scaffolder/src/alpha.ts | 3 -- plugins/scaffolder/src/next/Router/Router.tsx | 2 +- 7 files changed, 40 insertions(+), 30 deletions(-) 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-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/TemplateGroups/TemplateGroups.tsx b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx index 58e5e36173..50be7a4bdf 100644 --- a/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx +++ b/plugins/scaffolder-react/src/next/components/TemplateGroups/TemplateGroups.tsx @@ -15,7 +15,6 @@ */ import React, { useCallback } from 'react'; -import { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model'; import { useEntityList } from '@backstage/plugin-catalog-react'; import { isTemplateEntityV1beta3, diff --git a/plugins/scaffolder/alpha-api-report.md b/plugins/scaffolder/alpha-api-report.md index d0bb627d4d..6ceacdc008 100644 --- a/plugins/scaffolder/alpha-api-report.md +++ b/plugins/scaffolder/alpha-api-report.md @@ -13,6 +13,7 @@ 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< @@ -48,27 +49,6 @@ export const NextScaffolderPage: ( props: PropsWithChildren, ) => JSX.Element; -// @alpha (undocumented) -export type TemplateGroupFilter = { - title?: React_2.ReactNode; - filter: (entity: TemplateEntityV1beta3) => boolean; -}; - -// @alpha (undocumented) -export const TemplateGroups: (props: TemplateGroupsProps) => JSX.Element | null; - -// @alpha (undocumented) -export interface TemplateGroupsProps { - // (undocumented) - groups: TemplateGroupFilter[]; - // (undocumented) - TemplateCardComponent?: React_2.ComponentType<{ - template: TemplateEntityV1beta3; - }>; - // (undocumented) - templateFilter?: (entity: TemplateEntityV1beta3) => boolean; -} - // @alpha (undocumented) export type TemplateListPageProps = { TemplateCardComponent?: React_2.ComponentType<{ diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 5b8ea034cc..8f37f7cf50 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -138,8 +138,8 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2< string[], { showCounts?: boolean | undefined; - helperText?: string | undefined; kinds?: string[] | undefined; + helperText?: string | undefined; } >; @@ -148,8 +148,8 @@ export const EntityTagsPickerFieldSchema: FieldSchema< string[], { showCounts?: boolean | undefined; - helperText?: string | undefined; kinds?: string[] | undefined; + helperText?: string | undefined; } >; @@ -315,8 +315,8 @@ export const RepoUrlPickerFieldExtension: FieldExtensionComponent_2< | { azure?: string[] | undefined; github?: string[] | undefined; - bitbucket?: string[] | undefined; gitlab?: string[] | undefined; + bitbucket?: string[] | undefined; gerrit?: string[] | undefined; } | undefined; @@ -341,8 +341,8 @@ export const RepoUrlPickerFieldSchema: FieldSchema< | { azure?: string[] | undefined; github?: string[] | undefined; - bitbucket?: string[] | undefined; gitlab?: string[] | undefined; + bitbucket?: string[] | undefined; gerrit?: string[] | undefined; } | undefined; diff --git a/plugins/scaffolder/src/alpha.ts b/plugins/scaffolder/src/alpha.ts index 90b0680d27..d2bd762190 100644 --- a/plugins/scaffolder/src/alpha.ts +++ b/plugins/scaffolder/src/alpha.ts @@ -16,9 +16,6 @@ export { NextScaffolderPage } from './plugin'; export { - TemplateGroups, - type TemplateGroupFilter, - type TemplateGroupsProps, type NextRouterProps, type FormProps, type TemplateListPageProps, diff --git a/plugins/scaffolder/src/next/Router/Router.tsx b/plugins/scaffolder/src/next/Router/Router.tsx index e36bc7428a..9c50d0d979 100644 --- a/plugins/scaffolder/src/next/Router/Router.tsx +++ b/plugins/scaffolder/src/next/Router/Router.tsx @@ -23,6 +23,7 @@ import { import { NextFieldExtensionOptions, FormProps, + TemplateGroupFilter, } from '@backstage/plugin-scaffolder-react/alpha'; import { ScaffolderTaskOutput, @@ -32,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 { From 48da4c46e45fd48e2669d9ab23244e7cdcb06366 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Mar 2023 09:35:11 +0100 Subject: [PATCH 12/14] chore: added changesets for other pages Signed-off-by: blam --- .changeset/heavy-colts-wash.md | 5 +++++ .changeset/weak-turtles-arrive.md | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/heavy-colts-wash.md create mode 100644 .changeset/weak-turtles-arrive.md 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/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 From 83245c8ce69fa0da0e61dcde9acf7c30f731a0b7 Mon Sep 17 00:00:00 2001 From: blam Date: Tue, 21 Mar 2023 09:38:17 +0100 Subject: [PATCH 13/14] chore: delete the old helper Signed-off-by: blam --- .../components/TemplateList/TemplateList.tsx | 8 ++++--- .../scaffolder/src/lib/isTemplateEntity.ts | 23 ------------------- 2 files changed, 5 insertions(+), 26 deletions(-) delete mode 100644 plugins/scaffolder/src/lib/isTemplateEntity.ts 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/lib/isTemplateEntity.ts b/plugins/scaffolder/src/lib/isTemplateEntity.ts deleted file mode 100644 index 61ceabaa53..0000000000 --- a/plugins/scaffolder/src/lib/isTemplateEntity.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* - * 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'; From 3ca3ddb1215add9bd45bdb7ba60557b1a82f4647 Mon Sep 17 00:00:00 2001 From: Min Kim Date: Tue, 21 Mar 2023 06:27:39 -0400 Subject: [PATCH 14/14] Format imports to combine duplicate source Signed-off-by: Min Kim --- .../src/next/TemplateListPage/TemplateListPage.tsx | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx index b1d7a66a94..863d3009e1 100644 --- a/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx +++ b/plugins/scaffolder/src/next/TemplateListPage/TemplateListPage.tsx @@ -38,13 +38,11 @@ import { import { ScaffolderPageContextMenu, TemplateCategoryPicker, -} from '@backstage/plugin-scaffolder-react/alpha'; - -import { RegisterExistingButton } from './RegisterExistingButton'; -import { TemplateGroupFilter, TemplateGroups, } from '@backstage/plugin-scaffolder-react/alpha'; + +import { RegisterExistingButton } from './RegisterExistingButton'; import { actionsRouteRef, editRouteRef,