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,