@backstage/plugin-scaffolder-react 1.13.0 → 1.13.2-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @backstage/plugin-scaffolder-react
2
2
 
3
+ ## 1.13.2-next.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 8b5ff7e: Fix issue with form state not refreshing when updating
8
+ - ade301c: Fix issue with `Stepper` and trying to trim additional properties. This is now all behind `liveOmit` and `omitExtraData` instead.
9
+ - Updated dependencies
10
+ - @backstage/core-components@0.16.0-next.0
11
+ - @backstage/catalog-client@1.8.0-next.0
12
+ - @backstage/catalog-model@1.7.0
13
+ - @backstage/core-plugin-api@1.10.0
14
+ - @backstage/frontend-plugin-api@0.9.1-next.0
15
+ - @backstage/theme@0.6.0
16
+ - @backstage/types@1.1.1
17
+ - @backstage/version-bridge@1.0.10
18
+ - @backstage/plugin-catalog-react@1.14.1-next.0
19
+ - @backstage/plugin-permission-react@0.4.27
20
+ - @backstage/plugin-scaffolder-common@1.5.6
21
+
3
22
  ## 1.13.0
4
23
 
5
24
  ### Minor Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder-react__alpha",
3
- "version": "1.13.0",
3
+ "version": "1.13.2-next.0",
4
4
  "main": "../dist/alpha.esm.js",
5
5
  "module": "../dist/alpha.esm.js",
6
6
  "types": "../dist/alpha.d.ts"
@@ -57,10 +57,9 @@ const Stepper = (stepperProps) => {
57
57
  const [activeStep, setActiveStep] = useState(0);
58
58
  const [isValidating, setIsValidating] = useState(false);
59
59
  const [initialState] = useFormDataFromQuery(props.initialState);
60
- const [formState, setFormState] = useState();
60
+ const [stepsState, setStepsState] = useState(initialState);
61
61
  const [errors, setErrors] = useState();
62
62
  const styles = useStyles();
63
- const makeStepKey = (step) => `step-${step}`;
64
63
  const backLabel = presentation?.buttonLabels?.backButtonText ?? backButtonText;
65
64
  const createLabel = presentation?.buttonLabels?.createButtonText ?? createButtonText;
66
65
  const reviewLabel = presentation?.buttonLabels?.reviewButtonText ?? reviewButtonText;
@@ -83,62 +82,53 @@ const Stepper = (stepperProps) => {
83
82
  apiHolder
84
83
  });
85
84
  }, [steps, activeStep, validators, apiHolder]);
86
- const handleBack = () => {
85
+ const handleBack = useCallback(() => {
87
86
  setActiveStep((prevActiveStep) => prevActiveStep - 1);
88
- };
89
- const handleChange = useCallback(
90
- (e) => {
91
- setFormState((current) => ({
92
- ...current,
93
- [makeStepKey(activeStep)]: e.formData
94
- }));
95
- },
96
- [setFormState, activeStep]
97
- );
87
+ }, [setActiveStep]);
98
88
  const currentStep = useTransformSchemaToProps(steps[activeStep], { layouts });
99
- const handleNext = async ({
100
- formData = {}
101
- }) => {
102
- setErrors(void 0);
103
- setIsValidating(true);
104
- const returnedValidation = await validation(formData);
105
- setIsValidating(false);
106
- if (hasErrors(returnedValidation)) {
107
- setErrors(returnedValidation);
108
- } else {
109
- setErrors(void 0);
110
- setActiveStep((prevActiveStep) => {
111
- const stepNum = prevActiveStep + 1;
112
- analytics.captureEvent("click", `Next Step (${stepNum})`);
113
- return stepNum;
114
- });
115
- }
116
- setFormState((current) => ({
117
- ...current,
118
- [makeStepKey(activeStep)]: formData
119
- }));
120
- };
121
89
  const {
122
90
  formContext: propFormContext,
123
91
  uiSchema: propUiSchema,
92
+ liveOmit: _shouldLiveOmit,
93
+ omitExtraData: _shouldOmitExtraData,
124
94
  ...restFormProps
125
95
  } = props.formProps ?? {};
96
+ const handleChange = useCallback(
97
+ (e) => {
98
+ setStepsState((current) => {
99
+ return { ...current, ...e.formData };
100
+ });
101
+ },
102
+ [setStepsState]
103
+ );
104
+ const handleNext = useCallback(
105
+ async ({ formData = {} }) => {
106
+ setErrors(void 0);
107
+ setIsValidating(true);
108
+ const returnedValidation = await validation(formData);
109
+ setStepsState((current) => ({
110
+ ...current,
111
+ ...formData
112
+ }));
113
+ setIsValidating(false);
114
+ if (hasErrors(returnedValidation)) {
115
+ setErrors(returnedValidation);
116
+ } else {
117
+ setErrors(void 0);
118
+ setActiveStep((prevActiveStep) => {
119
+ const stepNum = prevActiveStep + 1;
120
+ analytics.captureEvent("click", `Next Step (${stepNum})`);
121
+ return stepNum;
122
+ });
123
+ }
124
+ },
125
+ [validation, analytics]
126
+ );
126
127
  const mergedUiSchema = merge({}, propUiSchema, currentStep?.uiSchema);
127
- const mergedState = useMemo(() => {
128
- if (!formState) {
129
- return initialState;
130
- }
131
- const { [makeStepKey(activeStep)]: activeState, ...historicalState } = formState;
132
- const chronologicalState = {
133
- ...historicalState,
134
- [makeStepKey(activeStep)]: activeState
135
- };
136
- return merge({}, ...Object.values(chronologicalState));
137
- }, [formState, activeStep, initialState]);
138
128
  const handleCreate = useCallback(() => {
139
- props.onCreate(mergedState);
129
+ props.onCreate(stepsState);
140
130
  analytics.captureEvent("click", `${createLabel}`);
141
- }, [props, mergedState, analytics, createLabel]);
131
+ }, [props, stepsState, analytics, createLabel]);
142
132
  return /* @__PURE__ */ React.createElement(React.Fragment, null, isValidating && /* @__PURE__ */ React.createElement(LinearProgress, { variant: "indeterminate" }), /* @__PURE__ */ React.createElement(
143
133
  MuiStepper,
144
134
  {
@@ -165,10 +155,11 @@ const Stepper = (stepperProps) => {
165
155
  ), /* @__PURE__ */ React.createElement("div", { className: styles.formWrapper }, activeStep < steps.length ? /* @__PURE__ */ React.createElement(
166
156
  Form,
167
157
  {
158
+ key: activeStep,
168
159
  validator,
169
160
  extraErrors: errors,
170
- formData: mergedState,
171
- formContext: { ...propFormContext, formData: mergedState },
161
+ formData: stepsState,
162
+ formContext: { ...propFormContext, formData: stepsState },
172
163
  schema: currentStep.schema,
173
164
  uiSchema: mergedUiSchema,
174
165
  onSubmit: handleNext,
@@ -206,14 +197,14 @@ const Stepper = (stepperProps) => {
206
197
  ReviewStepComponent,
207
198
  {
208
199
  disableButtons: isValidating,
209
- formData: mergedState,
200
+ formData: stepsState,
210
201
  handleBack,
211
202
  handleReset: () => {
212
203
  },
213
204
  steps,
214
205
  handleCreate
215
206
  }
216
- ) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ReviewStateComponent, { formState: mergedState, schemas: steps }), /* @__PURE__ */ React.createElement("div", { className: styles.footer }, /* @__PURE__ */ React.createElement(
207
+ ) : /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(ReviewStateComponent, { formState: stepsState, schemas: steps }), /* @__PURE__ */ React.createElement("div", { className: styles.footer }, /* @__PURE__ */ React.createElement(
217
208
  Button,
218
209
  {
219
210
  onClick: handleBack,
@@ -1 +1 @@
1
- {"version":3,"file":"Stepper.esm.js","sources":["../../../../src/next/components/Stepper/Stepper.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useAnalytics, useApiHolder } from '@backstage/core-plugin-api';\nimport { JsonValue } from '@backstage/types';\nimport MuiStepper from '@material-ui/core/Stepper';\nimport MuiStep from '@material-ui/core/Step';\nimport MuiStepLabel from '@material-ui/core/StepLabel';\nimport Button from '@material-ui/core/Button';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport { type IChangeEvent } from '@rjsf/core';\nimport { ErrorSchema } from '@rjsf/utils';\nimport React, {\n useCallback,\n useMemo,\n useState,\n type ReactNode,\n ComponentType,\n} from 'react';\nimport {\n createAsyncValidators,\n type FormValidation,\n} from './createAsyncValidators';\nimport { ReviewState, type ReviewStateProps } from '../ReviewState';\nimport { useTemplateSchema, useFormDataFromQuery } from '../../hooks';\nimport { customizeValidator } from '@rjsf/validator-ajv8';\nimport { useTransformSchemaToProps } from '../../hooks/useTransformSchemaToProps';\nimport { hasErrors } from './utils';\nimport * as FieldOverrides from './FieldOverrides';\nimport { Form } from '../Form';\nimport {\n TemplateParameterSchema,\n LayoutOptions,\n FieldExtensionOptions,\n FormProps,\n} from '@backstage/plugin-scaffolder-react';\nimport { ReviewStepProps } from '@backstage/plugin-scaffolder-react';\nimport { ErrorListTemplate } from './ErrorListTemplate';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { PasswordWidget } from '../PasswordWidget/PasswordWidget';\nimport ajvErrors from 'ajv-errors';\nimport { merge } from 'lodash';\n\nconst validator = customizeValidator();\najvErrors(validator.ajv);\n\n/** @alpha */\nexport type BackstageTemplateStepperClassKey =\n | 'backButton'\n | 'footer'\n | 'formWrapper';\n\nconst useStyles = makeStyles(\n theme => ({\n backButton: {\n marginRight: theme.spacing(1),\n },\n footer: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n marginTop: theme.spacing(2),\n },\n formWrapper: {\n padding: theme.spacing(2),\n },\n }),\n { name: 'BackstageTemplateStepper' },\n);\n\n/**\n * The Props for {@link Stepper} component\n * @alpha\n */\nexport type StepperProps = {\n manifest: TemplateParameterSchema;\n extensions: FieldExtensionOptions<any, any>[];\n /**\n * @deprecated This was only ever used for analytics tracking purposes, which\n * is now handled in the `<Workflow />` component. Passing it in will have no\n * effect.\n */\n templateName?: string;\n formProps?: FormProps;\n initialState?: Record<string, JsonValue>;\n onCreate: (values: Record<string, JsonValue>) => Promise<void>;\n components?: {\n ReviewStepComponent?: ComponentType<ReviewStepProps>;\n ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element;\n backButtonText?: ReactNode;\n createButtonText?: ReactNode;\n reviewButtonText?: ReactNode;\n };\n layouts?: LayoutOptions[];\n};\n\n/**\n * The `Stepper` component is the Wizard that is rendered when a user selects a template\n * @alpha\n */\nexport const Stepper = (stepperProps: StepperProps) => {\n const { layouts = [], components = {}, ...props } = stepperProps;\n const {\n ReviewStateComponent = ReviewState,\n ReviewStepComponent,\n backButtonText = 'Back',\n createButtonText = 'Create',\n reviewButtonText = 'Review',\n } = components;\n const analytics = useAnalytics();\n const { presentation, steps } = useTemplateSchema(props.manifest);\n const apiHolder = useApiHolder();\n const [activeStep, setActiveStep] = useState(0);\n const [isValidating, setIsValidating] = useState(false);\n const [initialState] = useFormDataFromQuery(props.initialState);\n const [formState, setFormState] = useState<{\n [step: string]: Record<string, JsonValue>;\n }>();\n\n const [errors, setErrors] = useState<undefined | FormValidation>();\n const styles = useStyles();\n\n const makeStepKey = (step: string | number) => `step-${step}`;\n\n const backLabel =\n presentation?.buttonLabels?.backButtonText ?? backButtonText;\n const createLabel =\n presentation?.buttonLabels?.createButtonText ?? createButtonText;\n const reviewLabel =\n presentation?.buttonLabels?.reviewButtonText ?? reviewButtonText;\n\n const extensions = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, component }) => [name, component]),\n );\n }, [props.extensions]);\n\n const fields = useMemo(\n () => ({ ...FieldOverrides, ...extensions }),\n [extensions],\n );\n\n const validators = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, validation }) => [name, validation]),\n );\n }, [props.extensions]);\n\n const validation = useMemo(() => {\n return createAsyncValidators(steps[activeStep]?.mergedSchema, validators, {\n apiHolder,\n });\n }, [steps, activeStep, validators, apiHolder]);\n\n const handleBack = () => {\n setActiveStep(prevActiveStep => prevActiveStep - 1);\n };\n\n const handleChange = useCallback(\n (e: IChangeEvent) => {\n setFormState(current => ({\n ...current,\n [makeStepKey(activeStep)]: e.formData,\n }));\n },\n [setFormState, activeStep],\n );\n\n const currentStep = useTransformSchemaToProps(steps[activeStep], { layouts });\n\n const handleNext = async ({\n formData = {},\n }: {\n formData?: Record<string, JsonValue>;\n }) => {\n // The validation should never throw, as the validators are wrapped in a try/catch.\n // This makes it fine to set and unset state without try/catch.\n setErrors(undefined);\n setIsValidating(true);\n\n const returnedValidation = await validation(formData);\n\n setIsValidating(false);\n\n if (hasErrors(returnedValidation)) {\n setErrors(returnedValidation);\n } else {\n setErrors(undefined);\n setActiveStep(prevActiveStep => {\n const stepNum = prevActiveStep + 1;\n analytics.captureEvent('click', `Next Step (${stepNum})`);\n return stepNum;\n });\n }\n setFormState(current => ({\n ...current,\n [makeStepKey(activeStep)]: formData,\n }));\n };\n\n const {\n formContext: propFormContext,\n uiSchema: propUiSchema,\n ...restFormProps\n } = props.formProps ?? {};\n\n const mergedUiSchema = merge({}, propUiSchema, currentStep?.uiSchema);\n\n const mergedState = useMemo(() => {\n if (!formState) {\n return initialState;\n }\n const { [makeStepKey(activeStep)]: activeState, ...historicalState } =\n formState;\n const chronologicalState = {\n ...historicalState,\n [makeStepKey(activeStep)]: activeState,\n };\n return merge({}, ...Object.values(chronologicalState));\n }, [formState, activeStep, initialState]);\n\n const handleCreate = useCallback(() => {\n props.onCreate(mergedState);\n analytics.captureEvent('click', `${createLabel}`);\n }, [props, mergedState, analytics, createLabel]);\n\n return (\n <>\n {isValidating && <LinearProgress variant=\"indeterminate\" />}\n <MuiStepper\n activeStep={activeStep}\n alternativeLabel\n variant=\"elevation\"\n style={{ overflowX: 'auto' }}\n >\n {steps.map((step, index) => {\n const isAllowedLabelClick = activeStep > index;\n return (\n <MuiStep key={index}>\n <MuiStepLabel\n aria-label={`Step ${index + 1}`}\n style={{ cursor: isAllowedLabelClick ? 'pointer' : 'default' }}\n onClick={() => {\n if (isAllowedLabelClick) setActiveStep(index);\n }}\n >\n {step.title}\n </MuiStepLabel>\n </MuiStep>\n );\n })}\n <MuiStep>\n <MuiStepLabel>{reviewLabel}</MuiStepLabel>\n </MuiStep>\n </MuiStepper>\n <div className={styles.formWrapper}>\n {/* eslint-disable-next-line no-nested-ternary */}\n {activeStep < steps.length ? (\n <Form\n validator={validator}\n extraErrors={errors as unknown as ErrorSchema}\n formData={mergedState}\n formContext={{ ...propFormContext, formData: mergedState }}\n schema={currentStep.schema}\n uiSchema={mergedUiSchema}\n onSubmit={handleNext}\n fields={fields}\n showErrorList=\"top\"\n templates={{ ErrorListTemplate }}\n onChange={handleChange}\n widgets={{ password: PasswordWidget }}\n experimental_defaultFormStateBehavior={{\n allOf: 'populateDefaults',\n }}\n {...restFormProps}\n >\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1 || isValidating}\n >\n {backLabel}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={isValidating}\n >\n {activeStep === steps.length - 1 ? reviewLabel : 'Next'}\n </Button>\n </div>\n </Form>\n ) : // TODO: potentially move away from this pattern, deprecate?\n ReviewStepComponent ? (\n <ReviewStepComponent\n disableButtons={isValidating}\n formData={mergedState}\n handleBack={handleBack}\n handleReset={() => {}}\n steps={steps}\n handleCreate={handleCreate}\n />\n ) : (\n <>\n <ReviewStateComponent formState={mergedState} schemas={steps} />\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n {backLabel}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleCreate}\n >\n {createLabel}\n </Button>\n </div>\n </>\n )}\n </div>\n </>\n );\n};\n"],"names":["FieldOverrides","validation"],"mappings":"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"}
1
+ {"version":3,"file":"Stepper.esm.js","sources":["../../../../src/next/components/Stepper/Stepper.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useAnalytics, useApiHolder } from '@backstage/core-plugin-api';\nimport { JsonValue } from '@backstage/types';\nimport MuiStepper from '@material-ui/core/Stepper';\nimport MuiStep from '@material-ui/core/Step';\nimport MuiStepLabel from '@material-ui/core/StepLabel';\nimport Button from '@material-ui/core/Button';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport { type IChangeEvent } from '@rjsf/core';\nimport { ErrorSchema } from '@rjsf/utils';\nimport React, {\n useCallback,\n useMemo,\n useState,\n type ReactNode,\n ComponentType,\n} from 'react';\nimport {\n createAsyncValidators,\n type FormValidation,\n} from './createAsyncValidators';\nimport { ReviewState, type ReviewStateProps } from '../ReviewState';\nimport { useTemplateSchema, useFormDataFromQuery } from '../../hooks';\nimport { customizeValidator } from '@rjsf/validator-ajv8';\nimport { useTransformSchemaToProps } from '../../hooks/useTransformSchemaToProps';\nimport { hasErrors } from './utils';\nimport * as FieldOverrides from './FieldOverrides';\nimport { Form } from '../Form';\nimport {\n TemplateParameterSchema,\n LayoutOptions,\n FieldExtensionOptions,\n FormProps,\n} from '@backstage/plugin-scaffolder-react';\nimport { ReviewStepProps } from '@backstage/plugin-scaffolder-react';\nimport { ErrorListTemplate } from './ErrorListTemplate';\nimport { makeStyles } from '@material-ui/core/styles';\nimport { PasswordWidget } from '../PasswordWidget/PasswordWidget';\nimport ajvErrors from 'ajv-errors';\nimport { merge } from 'lodash';\n\nconst validator = customizeValidator();\najvErrors(validator.ajv);\n\n/** @alpha */\nexport type BackstageTemplateStepperClassKey =\n | 'backButton'\n | 'footer'\n | 'formWrapper';\n\nconst useStyles = makeStyles(\n theme => ({\n backButton: {\n marginRight: theme.spacing(1),\n },\n footer: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n marginTop: theme.spacing(2),\n },\n formWrapper: {\n padding: theme.spacing(2),\n },\n }),\n { name: 'BackstageTemplateStepper' },\n);\n\n/**\n * The Props for {@link Stepper} component\n * @alpha\n */\nexport type StepperProps = {\n manifest: TemplateParameterSchema;\n extensions: FieldExtensionOptions<any, any>[];\n /**\n * @deprecated This was only ever used for analytics tracking purposes, which\n * is now handled in the `<Workflow />` component. Passing it in will have no\n * effect.\n */\n templateName?: string;\n formProps?: FormProps;\n initialState?: Record<string, JsonValue>;\n onCreate: (values: Record<string, JsonValue>) => Promise<void>;\n components?: {\n ReviewStepComponent?: ComponentType<ReviewStepProps>;\n ReviewStateComponent?: (props: ReviewStateProps) => JSX.Element;\n backButtonText?: ReactNode;\n createButtonText?: ReactNode;\n reviewButtonText?: ReactNode;\n };\n layouts?: LayoutOptions[];\n};\n\n/**\n * The `Stepper` component is the Wizard that is rendered when a user selects a template\n * @alpha\n */\nexport const Stepper = (stepperProps: StepperProps) => {\n const { layouts = [], components = {}, ...props } = stepperProps;\n const {\n ReviewStateComponent = ReviewState,\n ReviewStepComponent,\n backButtonText = 'Back',\n createButtonText = 'Create',\n reviewButtonText = 'Review',\n } = components;\n const analytics = useAnalytics();\n const { presentation, steps } = useTemplateSchema(props.manifest);\n const apiHolder = useApiHolder();\n const [activeStep, setActiveStep] = useState(0);\n const [isValidating, setIsValidating] = useState(false);\n const [initialState] = useFormDataFromQuery(props.initialState);\n const [stepsState, setStepsState] =\n useState<Record<string, JsonValue>>(initialState);\n\n const [errors, setErrors] = useState<undefined | FormValidation>();\n const styles = useStyles();\n\n const backLabel =\n presentation?.buttonLabels?.backButtonText ?? backButtonText;\n const createLabel =\n presentation?.buttonLabels?.createButtonText ?? createButtonText;\n const reviewLabel =\n presentation?.buttonLabels?.reviewButtonText ?? reviewButtonText;\n\n const extensions = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, component }) => [name, component]),\n );\n }, [props.extensions]);\n\n const fields = useMemo(\n () => ({ ...FieldOverrides, ...extensions }),\n [extensions],\n );\n\n const validators = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, validation }) => [name, validation]),\n );\n }, [props.extensions]);\n\n const validation = useMemo(() => {\n return createAsyncValidators(steps[activeStep]?.mergedSchema, validators, {\n apiHolder,\n });\n }, [steps, activeStep, validators, apiHolder]);\n\n const handleBack = useCallback(() => {\n setActiveStep(prevActiveStep => prevActiveStep - 1);\n }, [setActiveStep]);\n\n const currentStep = useTransformSchemaToProps(steps[activeStep], { layouts });\n\n const {\n formContext: propFormContext,\n uiSchema: propUiSchema,\n liveOmit: _shouldLiveOmit,\n omitExtraData: _shouldOmitExtraData,\n ...restFormProps\n } = props.formProps ?? {};\n\n const handleChange = useCallback(\n (e: IChangeEvent) => {\n setStepsState(current => {\n return { ...current, ...e.formData };\n });\n },\n [setStepsState],\n );\n\n const handleNext = useCallback(\n async ({ formData = {} }: { formData?: Record<string, JsonValue> }) => {\n // The validation should never throw, as the validators are wrapped in a try/catch.\n // This makes it fine to set and unset state without try/catch.\n setErrors(undefined);\n setIsValidating(true);\n\n const returnedValidation = await validation(formData);\n\n setStepsState(current => ({\n ...current,\n ...formData,\n }));\n\n setIsValidating(false);\n\n if (hasErrors(returnedValidation)) {\n setErrors(returnedValidation);\n } else {\n setErrors(undefined);\n setActiveStep(prevActiveStep => {\n const stepNum = prevActiveStep + 1;\n analytics.captureEvent('click', `Next Step (${stepNum})`);\n return stepNum;\n });\n }\n },\n [validation, analytics],\n );\n\n const mergedUiSchema = merge({}, propUiSchema, currentStep?.uiSchema);\n\n const handleCreate = useCallback(() => {\n props.onCreate(stepsState);\n analytics.captureEvent('click', `${createLabel}`);\n }, [props, stepsState, analytics, createLabel]);\n\n return (\n <>\n {isValidating && <LinearProgress variant=\"indeterminate\" />}\n <MuiStepper\n activeStep={activeStep}\n alternativeLabel\n variant=\"elevation\"\n style={{ overflowX: 'auto' }}\n >\n {steps.map((step, index) => {\n const isAllowedLabelClick = activeStep > index;\n return (\n <MuiStep key={index}>\n <MuiStepLabel\n aria-label={`Step ${index + 1}`}\n style={{ cursor: isAllowedLabelClick ? 'pointer' : 'default' }}\n onClick={() => {\n if (isAllowedLabelClick) setActiveStep(index);\n }}\n >\n {step.title}\n </MuiStepLabel>\n </MuiStep>\n );\n })}\n <MuiStep>\n <MuiStepLabel>{reviewLabel}</MuiStepLabel>\n </MuiStep>\n </MuiStepper>\n <div className={styles.formWrapper}>\n {/* eslint-disable-next-line no-nested-ternary */}\n {activeStep < steps.length ? (\n <Form\n key={activeStep}\n validator={validator}\n extraErrors={errors as unknown as ErrorSchema}\n formData={stepsState}\n formContext={{ ...propFormContext, formData: stepsState }}\n schema={currentStep.schema}\n uiSchema={mergedUiSchema}\n onSubmit={handleNext}\n fields={fields}\n showErrorList=\"top\"\n templates={{ ErrorListTemplate }}\n onChange={handleChange}\n widgets={{ password: PasswordWidget }}\n experimental_defaultFormStateBehavior={{\n allOf: 'populateDefaults',\n }}\n {...restFormProps}\n >\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1 || isValidating}\n >\n {backLabel}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={isValidating}\n >\n {activeStep === steps.length - 1 ? reviewLabel : 'Next'}\n </Button>\n </div>\n </Form>\n ) : // TODO: potentially move away from this pattern, deprecate?\n ReviewStepComponent ? (\n <ReviewStepComponent\n disableButtons={isValidating}\n formData={stepsState}\n handleBack={handleBack}\n handleReset={() => {}}\n steps={steps}\n handleCreate={handleCreate}\n />\n ) : (\n <>\n <ReviewStateComponent formState={stepsState} schemas={steps} />\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n {backLabel}\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleCreate}\n >\n {createLabel}\n </Button>\n </div>\n </>\n )}\n </div>\n </>\n );\n};\n"],"names":["FieldOverrides","validation"],"mappings":"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"}
@@ -1,22 +1,26 @@
1
+ import { useMemo } from 'react';
2
+
1
3
  const useTransformSchemaToProps = (step, options = {}) => {
2
4
  const { layouts = [] } = options;
3
5
  const objectFieldTemplate = step?.uiSchema["ui:ObjectFieldTemplate"];
4
- if (typeof objectFieldTemplate !== "string") {
5
- return step;
6
- }
7
- const Layout = layouts.find(
8
- (layout) => layout.name === objectFieldTemplate
9
- )?.component;
10
- if (!Layout) {
11
- return step;
12
- }
13
- return {
14
- ...step,
15
- uiSchema: {
16
- ...step.uiSchema,
17
- ["ui:ObjectFieldTemplate"]: Layout
6
+ return useMemo(() => {
7
+ if (typeof objectFieldTemplate !== "string") {
8
+ return step;
9
+ }
10
+ const Layout = layouts.find(
11
+ (layout) => layout.name === objectFieldTemplate
12
+ )?.component;
13
+ if (!Layout) {
14
+ return step;
18
15
  }
19
- };
16
+ return {
17
+ ...step,
18
+ uiSchema: {
19
+ ...step.uiSchema,
20
+ ["ui:ObjectFieldTemplate"]: Layout
21
+ }
22
+ };
23
+ }, [layouts, objectFieldTemplate, step]);
20
24
  };
21
25
 
22
26
  export { useTransformSchemaToProps };
@@ -1 +1 @@
1
- {"version":3,"file":"useTransformSchemaToProps.esm.js","sources":["../../../src/next/hooks/useTransformSchemaToProps.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { LayoutOptions } from '../../layouts';\nimport { type ParsedTemplateSchema } from './useTemplateSchema';\n\ninterface Options {\n layouts?: LayoutOptions[];\n}\n\nexport const useTransformSchemaToProps = (\n step: ParsedTemplateSchema,\n options: Options = {},\n): ParsedTemplateSchema => {\n const { layouts = [] } = options;\n const objectFieldTemplate = step?.uiSchema['ui:ObjectFieldTemplate'] as\n | string\n | undefined;\n\n if (typeof objectFieldTemplate !== 'string') {\n return step;\n }\n\n const Layout = layouts.find(\n layout => layout.name === objectFieldTemplate,\n )?.component;\n\n if (!Layout) {\n return step;\n }\n\n return {\n ...step,\n uiSchema: {\n ...step.uiSchema,\n ['ui:ObjectFieldTemplate']: Layout,\n },\n };\n};\n"],"names":[],"mappings":"AAsBO,MAAM,yBAA4B,GAAA,CACvC,IACA,EAAA,OAAA,GAAmB,EACM,KAAA;AACzB,EAAA,MAAM,EAAE,OAAA,GAAU,EAAC,EAAM,GAAA,OAAA,CAAA;AACzB,EAAM,MAAA,mBAAA,GAAsB,IAAM,EAAA,QAAA,CAAS,wBAAwB,CAAA,CAAA;AAInE,EAAI,IAAA,OAAO,wBAAwB,QAAU,EAAA;AAC3C,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,SAAS,OAAQ,CAAA,IAAA;AAAA,IACrB,CAAA,MAAA,KAAU,OAAO,IAAS,KAAA,mBAAA;AAAA,GACzB,EAAA,SAAA,CAAA;AAEH,EAAA,IAAI,CAAC,MAAQ,EAAA;AACX,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAO,OAAA;AAAA,IACL,GAAG,IAAA;AAAA,IACH,QAAU,EAAA;AAAA,MACR,GAAG,IAAK,CAAA,QAAA;AAAA,MACR,CAAC,wBAAwB,GAAG,MAAA;AAAA,KAC9B;AAAA,GACF,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"useTransformSchemaToProps.esm.js","sources":["../../../src/next/hooks/useTransformSchemaToProps.ts"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useMemo } from 'react';\nimport { LayoutOptions } from '../../layouts';\nimport { type ParsedTemplateSchema } from './useTemplateSchema';\n\ninterface Options {\n layouts?: LayoutOptions[];\n}\n\nexport const useTransformSchemaToProps = (\n step: ParsedTemplateSchema,\n options: Options = {},\n): ParsedTemplateSchema => {\n const { layouts = [] } = options;\n const objectFieldTemplate = step?.uiSchema['ui:ObjectFieldTemplate'] as\n | string\n | undefined;\n return useMemo(() => {\n if (typeof objectFieldTemplate !== 'string') {\n return step;\n }\n\n const Layout = layouts.find(\n layout => layout.name === objectFieldTemplate,\n )?.component;\n\n if (!Layout) {\n return step;\n }\n return {\n ...step,\n uiSchema: {\n ...step.uiSchema,\n ['ui:ObjectFieldTemplate']: Layout,\n },\n };\n }, [layouts, objectFieldTemplate, step]);\n};\n"],"names":[],"mappings":";;AAuBO,MAAM,yBAA4B,GAAA,CACvC,IACA,EAAA,OAAA,GAAmB,EACM,KAAA;AACzB,EAAA,MAAM,EAAE,OAAA,GAAU,EAAC,EAAM,GAAA,OAAA,CAAA;AACzB,EAAM,MAAA,mBAAA,GAAsB,IAAM,EAAA,QAAA,CAAS,wBAAwB,CAAA,CAAA;AAGnE,EAAA,OAAO,QAAQ,MAAM;AACnB,IAAI,IAAA,OAAO,wBAAwB,QAAU,EAAA;AAC3C,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AAEA,IAAA,MAAM,SAAS,OAAQ,CAAA,IAAA;AAAA,MACrB,CAAA,MAAA,KAAU,OAAO,IAAS,KAAA,mBAAA;AAAA,KACzB,EAAA,SAAA,CAAA;AAEH,IAAA,IAAI,CAAC,MAAQ,EAAA;AACX,MAAO,OAAA,IAAA,CAAA;AAAA,KACT;AACA,IAAO,OAAA;AAAA,MACL,GAAG,IAAA;AAAA,MACH,QAAU,EAAA;AAAA,QACR,GAAG,IAAK,CAAA,QAAA;AAAA,QACR,CAAC,wBAAwB,GAAG,MAAA;AAAA,OAC9B;AAAA,KACF,CAAA;AAAA,GACC,EAAA,CAAC,OAAS,EAAA,mBAAA,EAAqB,IAAI,CAAC,CAAA,CAAA;AACzC;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-scaffolder-react",
3
- "version": "1.13.0",
3
+ "version": "1.13.2-next.0",
4
4
  "description": "A frontend library that helps other Backstage plugins interact with the Scaffolder",
5
5
  "backstage": {
6
6
  "role": "web-library",
@@ -57,17 +57,17 @@
57
57
  "test": "backstage-cli package test"
58
58
  },
59
59
  "dependencies": {
60
- "@backstage/catalog-client": "^1.7.1",
61
- "@backstage/catalog-model": "^1.7.0",
62
- "@backstage/core-components": "^0.15.1",
63
- "@backstage/core-plugin-api": "^1.10.0",
64
- "@backstage/frontend-plugin-api": "^0.9.0",
65
- "@backstage/plugin-catalog-react": "^1.14.0",
66
- "@backstage/plugin-permission-react": "^0.4.27",
67
- "@backstage/plugin-scaffolder-common": "^1.5.6",
68
- "@backstage/theme": "^0.6.0",
69
- "@backstage/types": "^1.1.1",
70
- "@backstage/version-bridge": "^1.0.10",
60
+ "@backstage/catalog-client": "1.8.0-next.0",
61
+ "@backstage/catalog-model": "1.7.0",
62
+ "@backstage/core-components": "0.16.0-next.0",
63
+ "@backstage/core-plugin-api": "1.10.0",
64
+ "@backstage/frontend-plugin-api": "0.9.1-next.0",
65
+ "@backstage/plugin-catalog-react": "1.14.1-next.0",
66
+ "@backstage/plugin-permission-react": "0.4.27",
67
+ "@backstage/plugin-scaffolder-common": "1.5.6",
68
+ "@backstage/theme": "0.6.0",
69
+ "@backstage/types": "1.1.1",
70
+ "@backstage/version-bridge": "1.0.10",
71
71
  "@material-ui/core": "^4.12.2",
72
72
  "@material-ui/icons": "^4.9.1",
73
73
  "@material-ui/lab": "4.0.0-alpha.61",
@@ -93,12 +93,12 @@
93
93
  "zod-to-json-schema": "^3.20.4"
94
94
  },
95
95
  "devDependencies": {
96
- "@backstage/cli": "^0.28.0",
97
- "@backstage/core-app-api": "^1.15.1",
98
- "@backstage/plugin-catalog": "^1.24.0",
99
- "@backstage/plugin-catalog-common": "^1.1.0",
100
- "@backstage/plugin-permission-common": "^0.8.1",
101
- "@backstage/test-utils": "^1.7.0",
96
+ "@backstage/cli": "0.29.0-next.0",
97
+ "@backstage/core-app-api": "1.15.1",
98
+ "@backstage/plugin-catalog": "1.24.1-next.0",
99
+ "@backstage/plugin-catalog-common": "1.1.0",
100
+ "@backstage/plugin-permission-common": "0.8.1",
101
+ "@backstage/test-utils": "1.7.0",
102
102
  "@testing-library/dom": "^10.0.0",
103
103
  "@testing-library/jest-dom": "^6.0.0",
104
104
  "@testing-library/react": "^16.0.0",