From 72ea4f64b347f258a334cddb2363435d83e0ae3a Mon Sep 17 00:00:00 2001 From: Paul Cowan Date: Tue, 17 Jan 2023 20:05:25 +0000 Subject: [PATCH] consolidate props in Stepper and Workflow Signed-off-by: Paul Cowan --- plugins/scaffolder-react/api-report.md | 4 +- .../next/components/Stepper/Stepper.test.tsx | 30 ++++++----- .../src/next/components/Stepper/Stepper.tsx | 19 +++---- .../components/Workflow/Workflow.test.tsx | 52 ++++++++++++++----- .../src/next/components/Workflow/Workflow.tsx | 46 +++++----------- .../TemplateWizardPage/TemplateWizardPage.tsx | 6 +-- 6 files changed, 84 insertions(+), 73 deletions(-) diff --git a/plugins/scaffolder-react/api-report.md b/plugins/scaffolder-react/api-report.md index 3c03bf2d15..7fdb2ff264 100644 --- a/plugins/scaffolder-react/api-report.md +++ b/plugins/scaffolder-react/api-report.md @@ -355,7 +355,7 @@ export type StepperProps = { templateName?: string; FormProps?: FormProps; initialState?: Record; - onComplete: (values: Record) => Promise; + onCreate: (values: Record) => Promise; ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element; createButtonText?: string; reviewButtonText?: string; @@ -456,7 +456,7 @@ export interface WorkflowProps { // (undocumented) namespace: string; // (undocumented) - onComplete: (values: Record) => Promise; + onCreate: (values: Record) => Promise; // (undocumented) onError(error: Error | undefined): JSX.Element | null; // (undocumented) diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx index e460afbdfc..5dbce3243f 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.test.tsx @@ -33,7 +33,7 @@ describe('Stepper', () => { }; const { getByText } = await renderInTestApp( - , + , ); for (const step of manifest.steps) { @@ -51,7 +51,7 @@ describe('Stepper', () => { }; const { getByRole } = await renderInTestApp( - , + , ); expect(getByRole('button', { name: 'Next' })).toBeInTheDocument(); @@ -91,7 +91,7 @@ describe('Stepper', () => { }; const { getByRole } = await renderInTestApp( - , + , ); await fireEvent.change(getByRole('textbox', { name: 'name' }), { @@ -162,7 +162,7 @@ describe('Stepper', () => { title: 'React JSON Schema Form Test', }; - const onComplete = jest.fn(async (values: Record) => { + const onCreate = jest.fn(async (values: Record) => { expect(values).toEqual({ first: { repository: 'Repo' }, second: { owner: 'Owner' }, @@ -172,7 +172,7 @@ describe('Stepper', () => { const { getByRole } = await renderInTestApp( { await fireEvent.click(getByRole('button', { name: 'Create' })); }); - expect(onComplete).toHaveBeenCalled(); + expect(onCreate).toHaveBeenCalled(); }); it('should render custom field extensions properly', async () => { @@ -229,7 +229,7 @@ describe('Stepper', () => { , ); @@ -266,7 +266,7 @@ describe('Stepper', () => { , ); @@ -308,7 +308,7 @@ describe('Stepper', () => { }); const { getByRole } = await renderInTestApp( - , + , ); expect(getByRole('textbox', { name: 'firstName' })).toHaveValue('John'); @@ -331,12 +331,12 @@ describe('Stepper', () => { title: 'initialize formData', }; - const onComplete = jest.fn(async (values: Record) => { + const onCreate = jest.fn(async (values: Record) => { expect(values).toHaveProperty('firstName'); }); const { getByRole } = await renderInTestApp( - , + , ); await act(async () => { @@ -373,10 +373,12 @@ describe('Stepper', () => { const { getByRole } = await renderInTestApp( Make, + reviewButtonText: Inspect, + }} />, ); diff --git a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx index 37e86d1afa..950c9720de 100644 --- a/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx +++ b/plugins/scaffolder-react/src/next/components/Stepper/Stepper.tsx @@ -24,7 +24,7 @@ import { } from '@material-ui/core'; import { type IChangeEvent, withTheme } from '@rjsf/core-v5'; import { ErrorSchema, FieldValidation } from '@rjsf/utils'; -import React, { useCallback, useMemo, useState } from 'react'; +import React, { useCallback, useMemo, useState, type ReactNode } from 'react'; import { NextFieldExtensionOptions } from '../../extensions'; import { TemplateParameterSchema } from '../../../types'; import { createAsyncValidators } from './createAsyncValidators'; @@ -59,11 +59,12 @@ export type StepperProps = { templateName?: string; FormProps?: FormProps; initialState?: Record; - - onComplete: (values: Record) => Promise; - ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element; - createButtonText?: string; - reviewButtonText?: string; + onCreate: (values: Record) => Promise; + components?: { + ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element; + createButtonText?: ReactNode; + reviewButtonText?: ReactNode; + }; }; // TODO(blam): We require here, as the types in this package depend on @rjsf/core explicitly @@ -77,12 +78,12 @@ const Form = withTheme(require('@rjsf/material-ui-v5').Theme); */ export const Stepper = (stepperProps: StepperProps) => { + const { components = {}, ...props } = stepperProps; const { ReviewStateComponent = ReviewState, createButtonText = 'Create', reviewButtonText = 'Review', - ...props - } = stepperProps; + } = components; const analytics = useAnalytics(); const { steps } = useTemplateSchema(props.manifest); @@ -205,7 +206,7 @@ export const Stepper = (stepperProps: StepperProps) => {