@@ -43,7 +43,7 @@ export function SecurityTab(): JSX.Element | null {
|
||||
description={`
|
||||
## This is markdown
|
||||
- overriding the template description
|
||||
`}
|
||||
`}
|
||||
onComplete={onComplete}
|
||||
onError={onError}
|
||||
namespace="default"
|
||||
|
||||
@@ -20,16 +20,19 @@ import {
|
||||
FIELD_EXTENSION_WRAPPER_KEY,
|
||||
} from '../extensions/keys';
|
||||
|
||||
type Extension = Omit<FieldExtensionOptions, 'validation'> & { validation?: unknown }
|
||||
|
||||
/**
|
||||
* Hook that returns all custom field extensions from the current outlet.
|
||||
* @public
|
||||
*/
|
||||
export const useCustomFieldExtensions = <
|
||||
TComponentDataType = FieldExtensionOptions,
|
||||
TComponentDataType = FieldExtensionOptions
|
||||
>(
|
||||
outlet: React.ReactNode,
|
||||
defaultScaffolderFieldExtensions: Extension[] = []
|
||||
) => {
|
||||
return useElementFilter(outlet, elements =>
|
||||
const customFieldExtensions = useElementFilter(outlet, elements =>
|
||||
elements
|
||||
.selectByComponentData({
|
||||
key: FIELD_EXTENSION_WRAPPER_KEY,
|
||||
@@ -37,5 +40,15 @@ export const useCustomFieldExtensions = <
|
||||
.findComponentData<TComponentDataType>({
|
||||
key: FIELD_EXTENSION_KEY,
|
||||
}),
|
||||
);
|
||||
) as FieldExtensionOptions[];
|
||||
|
||||
return [
|
||||
...customFieldExtensions,
|
||||
...defaultScaffolderFieldExtensions.filter(
|
||||
({ name }) =>
|
||||
!customFieldExtensions.some(
|
||||
customFieldExtension => customFieldExtension.name === name,
|
||||
),
|
||||
),
|
||||
];
|
||||
};
|
||||
|
||||
@@ -31,7 +31,11 @@ import { Observable } from '@backstage/types';
|
||||
import { PathParams } from '@backstage/core-plugin-api';
|
||||
import { PropsWithChildren } from 'react';
|
||||
import { default as React_2 } from 'react';
|
||||
<<<<<<< HEAD
|
||||
import { ReactNode } from 'react';
|
||||
=======
|
||||
import type { ReactNode } from 'react';
|
||||
>>>>>>> 1a12ad8e8d (fix api-reports)
|
||||
import { RouteRef } from '@backstage/core-plugin-api';
|
||||
import { ScaffolderApi as ScaffolderApi_2 } from '@backstage/plugin-scaffolder-react';
|
||||
import { ScaffolderDryRunOptions as ScaffolderDryRunOptions_2 } from '@backstage/plugin-scaffolder-react';
|
||||
@@ -80,8 +84,29 @@ export type CustomFieldValidator<TFieldReturnValue> = (
|
||||
},
|
||||
) => void | Promise<void>;
|
||||
|
||||
// @alpha
|
||||
export function EmbeddedScaffolderWorkflow({
|
||||
namespace,
|
||||
templateName,
|
||||
customExtensionsElement,
|
||||
frontPage,
|
||||
finishPage,
|
||||
onComplete,
|
||||
onError,
|
||||
title,
|
||||
description,
|
||||
ReviewStateWrapper,
|
||||
}: EmbeddedScaffolderWorkflowProps): JSX.Element;
|
||||
|
||||
// @alpha (undocumented)
|
||||
export const EmbeddableWorkflow: (props: WorkflowProps) => JSX.Element;
|
||||
export type EmbeddedScaffolderWorkflowProps = Omit<
|
||||
WorkflowProps,
|
||||
'customFieldExtensions' | 'onComplete'
|
||||
> & {
|
||||
customExtensionsElement?: React_2.ReactNode;
|
||||
frontPage: ReactNode;
|
||||
finishPage: ReactNode;
|
||||
} & Partial<Pick<WorkflowProps, 'onComplete'>>;
|
||||
|
||||
// @public
|
||||
export const EntityNamePickerFieldExtension: FieldExtensionComponent<
|
||||
@@ -128,9 +153,9 @@ export type EntityPickerUiOptions =
|
||||
export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2<
|
||||
string[],
|
||||
{
|
||||
showCounts?: boolean | undefined;
|
||||
kinds?: string[] | undefined;
|
||||
helperText?: string | undefined;
|
||||
kinds?: string[] | undefined;
|
||||
showCounts?: boolean | undefined;
|
||||
}
|
||||
>;
|
||||
|
||||
@@ -138,9 +163,9 @@ export const EntityTagsPickerFieldExtension: FieldExtensionComponent_2<
|
||||
export const EntityTagsPickerFieldSchema: FieldSchema<
|
||||
string[],
|
||||
{
|
||||
showCounts?: boolean | undefined;
|
||||
kinds?: string[] | undefined;
|
||||
helperText?: string | undefined;
|
||||
kinds?: string[] | undefined;
|
||||
showCounts?: boolean | undefined;
|
||||
}
|
||||
>;
|
||||
|
||||
@@ -564,6 +589,7 @@ export type TemplateParameterSchema = TemplateParameterSchema_2;
|
||||
// @public
|
||||
export const TemplateTypePicker: () => JSX.Element | null;
|
||||
|
||||
<<<<<<< HEAD
|
||||
<<<<<<< HEAD
|
||||
// @public @deprecated (undocumented)
|
||||
export const useTemplateSecrets: () => ScaffolderUseTemplateSecrets_2;
|
||||
@@ -573,6 +599,8 @@ export const useGetCustomFields: (
|
||||
element: React_2.ReactNode,
|
||||
) => NextFieldExtensionOptions<unknown, unknown>[];
|
||||
|
||||
=======
|
||||
>>>>>>> 1a12ad8e8d (fix api-reports)
|
||||
// @public
|
||||
export const useTemplateSecrets: () => ScaffolderUseTemplateSecrets;
|
||||
|
||||
|
||||
@@ -93,16 +93,7 @@ export const Router = (props: RouterProps) => {
|
||||
const outlet = useOutlet();
|
||||
const TaskPageElement = TaskPageComponent ?? TaskPage;
|
||||
|
||||
const customFieldExtensions = useCustomFieldExtensions(outlet);
|
||||
const fieldExtensions = [
|
||||
...customFieldExtensions,
|
||||
...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(
|
||||
({ name }) =>
|
||||
!customFieldExtensions.some(
|
||||
customFieldExtension => customFieldExtension.name === name,
|
||||
),
|
||||
),
|
||||
] as FieldExtensionOptions[];
|
||||
const fieldExtensions = useCustomFieldExtensions(outlet, DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS);
|
||||
|
||||
// todo(blam): this should also be moved to a hook in -react
|
||||
const customLayouts = useElementFilter(outlet, elements =>
|
||||
|
||||
@@ -46,9 +46,8 @@ export * from './deprecated';
|
||||
/** next exports */
|
||||
export { NextScaffolderPage } from './plugin';
|
||||
export {
|
||||
EmbeddableWorkflow,
|
||||
useGetCustomFields,
|
||||
EmbeddedScaffolderWorkflow,
|
||||
type EmbeddedScaffolderWorkflowProps,
|
||||
type WorkflowProps,
|
||||
type ReviewStateProps,
|
||||
type ParsedTemplateSchema,
|
||||
|
||||
+13
-6
@@ -17,12 +17,15 @@
|
||||
import React, { useState, useCallback } from 'react';
|
||||
import type { ReactNode } from 'react';
|
||||
import type { JsonValue } from '@backstage/types';
|
||||
import { EmbeddableWorkflow, WorkflowProps } from '../Workflow/Workflow';
|
||||
import { FormProps } from '@backstage/plugin-scaffolder-react';
|
||||
import { useGetCustomFields } from '../Router';
|
||||
import { EmbeddableWorkflow, type WorkflowProps } from '../Workflow/Workflow';
|
||||
import { FormProps, useCustomFieldExtensions } from '@backstage/plugin-scaffolder-react';
|
||||
import { Box, Button } from '@material-ui/core';
|
||||
import { DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from '../../extensions/default';
|
||||
|
||||
type EmbeddedWorkflowProps = Omit<
|
||||
/**
|
||||
* @alpha
|
||||
*/
|
||||
export type EmbeddedScaffolderWorkflowProps = Omit<
|
||||
WorkflowProps,
|
||||
'customFieldExtensions' | 'onComplete'
|
||||
> & {
|
||||
@@ -41,6 +44,10 @@ type DisplayComponents = Record<Display, JSX.Element>;
|
||||
|
||||
type OnCompleteArgs = Parameters<WorkflowProps['onComplete']>[0];
|
||||
|
||||
/**
|
||||
* Allows the EmbeddableWorkflow to be called from outside of a normal scaffolder workflow
|
||||
* @alpha
|
||||
*/
|
||||
export function EmbeddedScaffolderWorkflow({
|
||||
namespace,
|
||||
templateName,
|
||||
@@ -52,9 +59,9 @@ export function EmbeddedScaffolderWorkflow({
|
||||
title,
|
||||
description,
|
||||
ReviewStateWrapper,
|
||||
}: EmbeddedWorkflowProps): JSX.Element {
|
||||
}: EmbeddedScaffolderWorkflowProps): JSX.Element {
|
||||
const [display, setDisplay] = useState<Display>('front');
|
||||
const fieldExtensions = useGetCustomFields(customExtensionsElement);
|
||||
const fieldExtensions = useCustomFieldExtensions(customExtensionsElement, DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS);
|
||||
|
||||
const startTemplate = useCallback(() => setDisplay('workflow'), []);
|
||||
|
||||
|
||||
@@ -13,4 +13,7 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
export { EmbeddedScaffolderWorkflow } from './EmbeddedScaffolderWorkflow';
|
||||
export {
|
||||
EmbeddedScaffolderWorkflow,
|
||||
type EmbeddedScaffolderWorkflowProps,
|
||||
} from './EmbeddedScaffolderWorkflow';
|
||||
|
||||
@@ -13,5 +13,5 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
export { Router, useGetCustomFields } from './Router';
|
||||
export { Router } from './Router';
|
||||
export type { NextRouterProps } from './Router';
|
||||
|
||||
@@ -121,9 +121,6 @@ export const Workflow = ({
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* @alpha
|
||||
*/
|
||||
export const EmbeddableWorkflow = (props: WorkflowProps) => (
|
||||
<SecretsContextProvider>
|
||||
<Workflow {...props} />
|
||||
|
||||
@@ -13,4 +13,4 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
export { type WorkflowProps, Workflow, EmbeddableWorkflow } from './Workflow';
|
||||
export { EmbeddableWorkflow, type WorkflowProps } from './Workflow';
|
||||
|
||||
@@ -19,3 +19,6 @@ export * from './TemplateWizardPage';
|
||||
export * from './types';
|
||||
export * from './routes';
|
||||
export * from './Workflow';
|
||||
export * from './EmbeddedScaffolderWorkflow';
|
||||
export type { WorkflowProps } from './Workflow';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user