diff --git a/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx b/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx index 24fc4e91c3..10663415a7 100644 --- a/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx +++ b/awx/ui_next/src/screens/Template/shared/JobTemplateForm.jsx @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import { withRouter } from 'react-router-dom'; import { withI18n } from '@lingui/react'; import { t } from '@lingui/macro'; -import { withFormik, Field } from 'formik'; +import { withFormik, useField, useFormikContext } from 'formik'; import { Form, FormGroup, @@ -47,7 +47,6 @@ function JobTemplateForm({ validateField, handleCancel, handleSubmit, - handleBlur, setFieldValue, submitError, i18n, @@ -62,6 +61,38 @@ function JobTemplateForm({ Boolean(template?.host_config_key) ); + const formikBag = useFormikContext(); + const formikValues = formikBag.values; + const setFormikFieldValue = formikBag.setFieldValue; + const [jobTypeField, jobTypeMeta, jobTypeHelpers] = useField({ + name: 'job_type', + validate: required(null, i18n), + }); + const [, inventoryMeta, inventoryHelpers] = useField('inventory'); + + const [, projectMeta, projectHelpers] = useField({ + name: 'project', + validate: () => handleProjectValidation(), + }); + + const [scmField] = useField('scm_branch'); + + const [playbookField, , playbookMeta] = useField({ + name: 'playbook', + validate: required(i18n._(t`Select a value for this field`), i18n), + }); + + const [credentialField, , credentialHelpers] = useField('credentials'); + const [labelsField, , labelsHelpers] = useField('labels'); + const [limitField, limitMeta] = useField('limit'); + const [verbosityField] = useField('verbosity'); + const [diffModeField, , diffModeHelpers] = useField('diff_mode'); + const [instanceGroupsField, , instanceGroupsHelpers] = useField( + 'instanceGroups' + ); + const [jobTagsField, , jobTagsHelpers] = useField('job_tags'); + const [skipTagsField, , skipTagsHelpers] = useField('skip_tags'); + const { request: fetchProject, error: projectContentError, @@ -184,26 +215,15 @@ function JobTemplateForm({ test environment setup, and report problems without executing the playbook.`)} > - - {({ form, field }) => { - const isValid = !form.touched.job_type || !form.errors.job_type; - return ( - { - form.setFieldValue('job_type', value); - }} - /> - ); + { + jobTypeHelpers.setValue(value); }} - + /> - - {({ form }) => ( - <> - { - form.setFieldTouched('inventory'); - }} - onChange={value => { - form.setValues({ - ...form.values, - inventory: value.id, - organizationId: value.organization, - }); - setInventory(value); - }} - required - touched={form.touched.inventory} - error={form.errors.inventory} - /> - {(form.touched.inventory || - form.touched.ask_inventory_on_launch) && - form.errors.inventory && ( -
- {form.errors.inventory} -
- )} - + inventoryHelpers.setTouched()} + onChange={value => { + inventoryHelpers.setValue(value.id); + setFormikFieldValue('organizationId', value.organization); + setInventory(value); + }} + required + touched={inventoryMeta.touched} + error={inventoryMeta.error} + /> + {(inventoryMeta.touched || formikValues.ask_inventory_on_launch) && + inventoryMeta.error && ( +
+ {inventoryMeta.error} +
)} -
- - {({ form }) => ( - form.setFieldTouched('project')} - tooltip={i18n._(t`Select the project containing the playbook + + projectHelpers.setTouched()} + tooltip={i18n._(t`Select the project containing the playbook you want this job to execute.`)} - isValid={!form.touched.project || !form.errors.project} - helperTextInvalid={form.errors.project} - onChange={handleProjectUpdate} - required - /> - )} - - {project && project.allow_override && ( + isValid={!projectMeta.touched || !projectMeta.error} + helperTextInvalid={projectMeta.error} + onChange={handleProjectUpdate} + required + /> + {project?.allow_override && ( - - {({ field }) => { - return ( - { - field.onChange(event); - }} - /> - ); + { + scmField.onChange(event); }} - + /> )} - - {({ field, form }) => { - const isValid = !form.touched.playbook || !form.errors.playbook; - return ( - - - form.setFieldTouched('playbook')} - onError={setContentError} - /> - - ); - }} - + + playbookMeta.setTouched()} + onError={setContentError} + /> + - - {({ field }) => { - return ( - - setFieldValue('credentials', newCredentials) - } - onError={setContentError} - /> - ); - }} - + + credentialHelpers.setValue(newCredentials) + } + onError={setContentError} + /> - - {({ field }) => ( - - + - setFieldValue('labels', labels)} - onError={setContentError} - /> - - )} - + /> + labelsHelpers.setValue(labels)} + onError={setContentError} + /> + - - {({ form, field }) => { - return ( - { - field.onChange(event); - }} - /> - ); + { + limitField.onChange(event); }} - + /> - - {({ field }) => ( - - )} - + - - {({ form, field }) => { - return ( - - form.setFieldValue(field.name, checked) - } - /> - ); - }} - + diffModeHelpers.setValue(checked)} + /> - - {({ field, form }) => ( - form.setFieldValue(field.name, value)} - tooltip={i18n._(t`Select the Instance Groups for this Organization + instanceGroupsHelpers.setValue(value)} + tooltip={i18n._(t`Select the Instance Groups for this Organization to run on.`)} - /> - )} - + /> - - {({ field, form }) => ( - form.setFieldValue(field.name, value)} - /> - )} - + jobTagsHelpers.setValue(value)} + /> - - {({ field, form }) => ( - form.setFieldValue(field.name, value)} - /> - )} - + skipTagsHelpers.setValue(value)} + />