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