mirror of
https://github.com/ansible/awx.git
synced 2026-01-12 10:30:03 -03:30
Removes uncessary formikContext items in favor of useField.
Removed OrgId value from formik and get that value from project field Updates tests and type.js to reflect those changes.
This commit is contained in:
parent
a867a32b4e
commit
fb4343d75e
@ -3,7 +3,7 @@ import { useHistory } from 'react-router-dom';
|
||||
import { Card, PageSection } from '@patternfly/react-core';
|
||||
import { CardBody } from '@components/Card';
|
||||
import JobTemplateForm from '../shared/JobTemplateForm';
|
||||
import { JobTemplatesAPI, OrganizationsAPI } from '@api';
|
||||
import { JobTemplatesAPI } from '@api';
|
||||
|
||||
function JobTemplateAdd() {
|
||||
const [formSubmitError, setFormSubmitError] = useState(null);
|
||||
@ -12,7 +12,6 @@ function JobTemplateAdd() {
|
||||
async function handleSubmit(values) {
|
||||
const {
|
||||
labels,
|
||||
organizationId,
|
||||
instanceGroups,
|
||||
initialInstanceGroups,
|
||||
credentials,
|
||||
@ -20,12 +19,13 @@ function JobTemplateAdd() {
|
||||
} = values;
|
||||
|
||||
setFormSubmitError(null);
|
||||
remainingValues.project = remainingValues.project.id;
|
||||
try {
|
||||
const {
|
||||
data: { id, type },
|
||||
} = await JobTemplatesAPI.create(remainingValues);
|
||||
await Promise.all([
|
||||
submitLabels(id, labels, organizationId),
|
||||
submitLabels(id, labels, values.project.summary_fields.organization.id),
|
||||
submitInstanceGroups(id, instanceGroups),
|
||||
submitCredentials(id, credentials),
|
||||
]);
|
||||
@ -35,16 +35,7 @@ function JobTemplateAdd() {
|
||||
}
|
||||
}
|
||||
|
||||
async function submitLabels(templateId, labels = [], formOrg) {
|
||||
let orgId = formOrg;
|
||||
|
||||
if (!orgId && labels.length > 0) {
|
||||
const {
|
||||
data: { results },
|
||||
} = await OrganizationsAPI.read();
|
||||
orgId = results[0].id;
|
||||
}
|
||||
|
||||
async function submitLabels(templateId, labels = [], orgId) {
|
||||
const associationPromises = labels.map(label =>
|
||||
JobTemplatesAPI.associateLabel(templateId, label, orgId)
|
||||
);
|
||||
|
||||
@ -33,7 +33,7 @@ const jobTemplateData = {
|
||||
limit: '',
|
||||
name: '',
|
||||
playbook: '',
|
||||
project: 1,
|
||||
project: { id: 1, summary_fields: { organization: { id: 1 } } },
|
||||
scm_branch: '',
|
||||
skip_tags: '',
|
||||
timeout: 0,
|
||||
@ -123,6 +123,7 @@ describe('<JobTemplateAdd />', () => {
|
||||
wrapper.find('ProjectLookup').invoke('onChange')({
|
||||
id: 2,
|
||||
name: 'project',
|
||||
summary_fields: { organization: { id: 1, name: 'Org Foo' } },
|
||||
});
|
||||
wrapper.update();
|
||||
wrapper
|
||||
@ -161,6 +162,7 @@ describe('<JobTemplateAdd />', () => {
|
||||
id: 1,
|
||||
type: 'job_template',
|
||||
...jobTemplateData,
|
||||
project: jobTemplateData.project.id,
|
||||
},
|
||||
});
|
||||
let wrapper;
|
||||
@ -181,6 +183,7 @@ describe('<JobTemplateAdd />', () => {
|
||||
wrapper.find('ProjectLookup').invoke('onChange')({
|
||||
id: 2,
|
||||
name: 'project',
|
||||
summary_fields: { organization: { id: 1, name: 'Org Foo' } },
|
||||
});
|
||||
wrapper.update();
|
||||
wrapper
|
||||
|
||||
@ -4,7 +4,7 @@ import { withRouter, Redirect } from 'react-router-dom';
|
||||
import { CardBody } from '@components/Card';
|
||||
import ContentError from '@components/ContentError';
|
||||
import ContentLoading from '@components/ContentLoading';
|
||||
import { JobTemplatesAPI, OrganizationsAPI, ProjectsAPI } from '@api';
|
||||
import { JobTemplatesAPI, ProjectsAPI } from '@api';
|
||||
import { JobTemplate } from '@types';
|
||||
import { getAddedAndRemoved } from '@util/lists';
|
||||
import JobTemplateForm from '../shared/JobTemplateForm';
|
||||
@ -97,7 +97,6 @@ class JobTemplateEdit extends Component {
|
||||
const { template, history } = this.props;
|
||||
const {
|
||||
labels,
|
||||
organizationId,
|
||||
instanceGroups,
|
||||
initialInstanceGroups,
|
||||
credentials,
|
||||
@ -105,10 +104,14 @@ class JobTemplateEdit extends Component {
|
||||
} = values;
|
||||
|
||||
this.setState({ formSubmitError: null });
|
||||
remainingValues.project = values.project.id;
|
||||
try {
|
||||
await JobTemplatesAPI.update(template.id, remainingValues);
|
||||
await Promise.all([
|
||||
this.submitLabels(labels, organizationId),
|
||||
this.submitLabels(
|
||||
labels,
|
||||
values.project.summary_fields.organization.id
|
||||
),
|
||||
this.submitInstanceGroups(instanceGroups, initialInstanceGroups),
|
||||
this.submitCredentials(credentials),
|
||||
]);
|
||||
@ -118,22 +121,14 @@ class JobTemplateEdit extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
async submitLabels(labels = [], formOrgId) {
|
||||
async submitLabels(labels = [], orgId) {
|
||||
const { template } = this.props;
|
||||
let orgId = formOrgId;
|
||||
|
||||
const { added, removed } = getAddedAndRemoved(
|
||||
template.summary_fields.labels.results,
|
||||
labels
|
||||
);
|
||||
|
||||
if (!orgId && added.length > 0) {
|
||||
const {
|
||||
data: { results },
|
||||
} = await OrganizationsAPI.read();
|
||||
orgId = results[0].id;
|
||||
}
|
||||
|
||||
const disassociationPromises = removed.map(label =>
|
||||
JobTemplatesAPI.disassociateLabel(template.id, label)
|
||||
);
|
||||
|
||||
@ -35,7 +35,7 @@ const mockJobTemplate = {
|
||||
limit: '',
|
||||
name: 'Foo',
|
||||
playbook: 'Baz',
|
||||
project: 3,
|
||||
project: { id: 3, summary_fields: { organization: { id: 1 } } },
|
||||
scm_branch: '',
|
||||
skip_tags: '',
|
||||
summary_fields: {
|
||||
@ -239,6 +239,7 @@ describe('<JobTemplateEdit />', () => {
|
||||
|
||||
const expected = {
|
||||
...mockJobTemplate,
|
||||
project: mockJobTemplate.project.id,
|
||||
...updatedTemplateData,
|
||||
};
|
||||
delete expected.summary_fields;
|
||||
|
||||
@ -50,7 +50,6 @@ function JobTemplateForm({
|
||||
setFieldValue,
|
||||
submitError,
|
||||
i18n,
|
||||
touched,
|
||||
}) {
|
||||
const [contentError, setContentError] = useState(false);
|
||||
const [project, setProject] = useState(null);
|
||||
@ -61,23 +60,20 @@ function JobTemplateForm({
|
||||
Boolean(template?.host_config_key)
|
||||
);
|
||||
|
||||
const formikBag = useFormikContext();
|
||||
const formikValues = formikBag.values;
|
||||
const setFormikFieldValue = formikBag.setFieldValue;
|
||||
const { values: formikValues } = useFormikContext();
|
||||
const [jobTypeField, jobTypeMeta, jobTypeHelpers] = useField({
|
||||
name: 'job_type',
|
||||
validate: required(null, i18n),
|
||||
});
|
||||
const [, inventoryMeta, inventoryHelpers] = useField('inventory');
|
||||
|
||||
const [, projectMeta, projectHelpers] = useField({
|
||||
const [projectField, projectMeta, projectHelpers] = useField({
|
||||
name: 'project',
|
||||
validate: () => handleProjectValidation(),
|
||||
});
|
||||
|
||||
const [scmField] = useField('scm_branch');
|
||||
const [scmField, , scmHelpers] = useField('scm_branch');
|
||||
|
||||
const [playbookField, , playbookMeta] = useField({
|
||||
const [playbookField, playbookMeta, playbookHelpers] = useField({
|
||||
name: 'playbook',
|
||||
validate: required(i18n._(t`Select a value for this field`), i18n),
|
||||
});
|
||||
@ -131,7 +127,7 @@ function JobTemplateForm({
|
||||
}, [loadRelatedInstanceGroups]);
|
||||
|
||||
const handleProjectValidation = () => {
|
||||
if (!project && touched.project) {
|
||||
if (!project && projectMeta.touched) {
|
||||
return i18n._(t`Select a value for this field`);
|
||||
}
|
||||
if (project && project.status === 'never updated') {
|
||||
@ -143,11 +139,11 @@ function JobTemplateForm({
|
||||
const handleProjectUpdate = useCallback(
|
||||
newProject => {
|
||||
setProject(newProject);
|
||||
setFieldValue('project', newProject.id);
|
||||
setFieldValue('playbook', 0);
|
||||
setFieldValue('scm_branch', '');
|
||||
projectHelpers.setValue(newProject);
|
||||
playbookHelpers.setValue(0);
|
||||
scmHelpers.setValue('');
|
||||
},
|
||||
[setFieldValue, setProject]
|
||||
[setProject, projectHelpers, playbookHelpers, scmHelpers]
|
||||
);
|
||||
|
||||
const jobTypeOptions = [
|
||||
@ -239,7 +235,6 @@ function JobTemplateForm({
|
||||
onBlur={() => inventoryHelpers.setTouched()}
|
||||
onChange={value => {
|
||||
inventoryHelpers.setValue(value.id);
|
||||
setFormikFieldValue('organizationId', value.organization);
|
||||
setInventory(value);
|
||||
}}
|
||||
required
|
||||
@ -293,11 +288,10 @@ function JobTemplateForm({
|
||||
content={i18n._(t`Select the playbook to be executed by this job.`)}
|
||||
/>
|
||||
<PlaybookSelect
|
||||
projectId={formikValues.project}
|
||||
projectId={project?.id || projectField.value?.id}
|
||||
isValid={!(playbookMeta.touched || playbookMeta.error)}
|
||||
form={formikBag}
|
||||
field={playbookField}
|
||||
onBlur={() => playbookMeta.setTouched()}
|
||||
onBlur={() => playbookHelpers.setTouched()}
|
||||
onError={setContentError}
|
||||
/>
|
||||
</FormGroup>
|
||||
@ -581,10 +575,6 @@ const FormikApp = withFormik({
|
||||
},
|
||||
} = template;
|
||||
|
||||
const hasInventory = summary_fields.inventory
|
||||
? summary_fields.inventory.organization_id
|
||||
: null;
|
||||
|
||||
return {
|
||||
ask_credential_on_launch: template.ask_credential_on_launch || false,
|
||||
ask_diff_mode_on_launch: template.ask_diff_mode_on_launch || false,
|
||||
@ -600,7 +590,7 @@ const FormikApp = withFormik({
|
||||
description: template.description || '',
|
||||
job_type: template.job_type || 'run',
|
||||
inventory: template.inventory || null,
|
||||
project: template.project || '',
|
||||
project: template.project || null,
|
||||
scm_branch: template.scm_branch || '',
|
||||
playbook: template.playbook || '',
|
||||
labels: summary_fields.labels.results || [],
|
||||
@ -617,7 +607,6 @@ const FormikApp = withFormik({
|
||||
allow_simultaneous: template.allow_simultaneous || false,
|
||||
use_fact_cache: template.use_fact_cache || false,
|
||||
host_config_key: template.host_config_key || '',
|
||||
organizationId: hasInventory,
|
||||
initialInstanceGroups: [],
|
||||
instanceGroups: [],
|
||||
credentials: summary_fields.credentials || [],
|
||||
|
||||
@ -14,7 +14,7 @@ describe('<JobTemplateForm />', () => {
|
||||
description: 'Bar',
|
||||
job_type: 'run',
|
||||
inventory: 2,
|
||||
project: 3,
|
||||
project: { id: 3, summary_fields: { organization: { id: 1 } } },
|
||||
playbook: 'Baz',
|
||||
type: 'job_template',
|
||||
scm_branch: 'Foo',
|
||||
|
||||
@ -5,15 +5,7 @@ import { t } from '@lingui/macro';
|
||||
import AnsibleSelect from '@components/AnsibleSelect';
|
||||
import { ProjectsAPI } from '@api';
|
||||
|
||||
function PlaybookSelect({
|
||||
projectId,
|
||||
isValid,
|
||||
form,
|
||||
field,
|
||||
onBlur,
|
||||
onError,
|
||||
i18n,
|
||||
}) {
|
||||
function PlaybookSelect({ projectId, isValid, field, onBlur, onError, i18n }) {
|
||||
const [options, setOptions] = useState([]);
|
||||
|
||||
useEffect(() => {
|
||||
@ -47,7 +39,6 @@ function PlaybookSelect({
|
||||
id="template-playbook"
|
||||
data={options}
|
||||
isValid={isValid}
|
||||
form={form}
|
||||
{...field}
|
||||
onBlur={onBlur}
|
||||
/>
|
||||
|
||||
@ -70,7 +70,7 @@ export const JobTemplate = shape({
|
||||
inventory: number,
|
||||
job_type: oneOf(['run', 'check']),
|
||||
playbook: string,
|
||||
project: number,
|
||||
project: shape({}),
|
||||
});
|
||||
|
||||
export const Inventory = shape({
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user