Merge pull request #12874 from mabashian/wf-inv-permissions

Fixed bug where inventory field was erroneously disabled on WFJT form
This commit is contained in:
Sarah Akus 2022-09-27 11:27:28 -04:00 committed by GitHub
commit 4ffa577d05
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 49 additions and 24 deletions

View File

@ -26,7 +26,6 @@ function InventoryLookup({
hideSmartInventories,
history,
isDisabled,
isOverrideDisabled,
isPromptableField,
onBlur,
onChange,
@ -39,13 +38,7 @@ function InventoryLookup({
const autoPopulateLookup = useAutoPopulateLookup(onChange);
const {
result: {
inventories,
count,
relatedSearchableKeys,
searchableKeys,
canEdit,
},
result: { inventories, count, relatedSearchableKeys, searchableKeys },
request: fetchInventories,
error,
isLoading,
@ -85,8 +78,6 @@ function InventoryLookup({
key,
type: actionsResponse.data.actions?.GET[key].type,
})),
canEdit:
Boolean(actionsResponse.data.actions.POST) || isOverrideDisabled,
};
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [autoPopulate, autoPopulateLookup, history.location]),
@ -95,7 +86,6 @@ function InventoryLookup({
count: 0,
relatedSearchableKeys: [],
searchableKeys: [],
canEdit: false,
}
);
@ -129,7 +119,7 @@ function InventoryLookup({
label={t`Inventory`}
promptId={promptId}
promptName={promptName}
isDisabled={!canEdit || isDisabled}
isDisabled={isDisabled}
tooltip={t`Select the inventory containing the hosts
you want this job to manage.`}
>
@ -145,7 +135,7 @@ function InventoryLookup({
fieldName={fieldName}
validate={validate}
isLoading={isLoading}
isDisabled={!canEdit || isDisabled}
isDisabled={isDisabled}
qsConfig={QS_CONFIG}
renderOptionsList={({ state, dispatch, canDelete }) => (
<OptionsList
@ -200,7 +190,7 @@ function InventoryLookup({
onBlur={onBlur}
required={required}
isLoading={isLoading}
isDisabled={!canEdit || isDisabled}
isDisabled={isDisabled}
qsConfig={QS_CONFIG}
renderOptionsList={({ state, dispatch, canDelete }) => (
<OptionsList
@ -251,7 +241,6 @@ InventoryLookup.propTypes = {
fieldName: string,
hideSmartInventories: bool,
isDisabled: bool,
isOverrideDisabled: bool,
onChange: func.isRequired,
required: bool,
validate: func,
@ -264,7 +253,6 @@ InventoryLookup.defaultProps = {
fieldName: 'inventory',
hideSmartInventories: false,
isDisabled: false,
isOverrideDisabled: false,
required: false,
validate: () => {},
value: null,

View File

@ -99,7 +99,7 @@ describe('InventoryLookup', () => {
await act(async () => {
wrapper = mountWithContexts(
<Formik>
<InventoryLookup isOverrideDisabled onChange={() => {}} />
<InventoryLookup onChange={() => {}} />
</Formik>
);
});
@ -121,7 +121,7 @@ describe('InventoryLookup', () => {
await act(async () => {
wrapper = mountWithContexts(
<Formik>
<InventoryLookup onChange={() => {}} />
<InventoryLookup isDisabled onChange={() => {}} />
</Formik>
);
});

View File

@ -3,7 +3,12 @@ import { useHistory } from 'react-router-dom';
import { CardBody } from 'components/Card';
import { getAddedAndRemoved } from 'util/lists';
import { WorkflowJobTemplatesAPI, OrganizationsAPI, UsersAPI } from 'api';
import {
InventoriesAPI,
WorkflowJobTemplatesAPI,
OrganizationsAPI,
UsersAPI,
} from 'api';
import { useConfig } from 'contexts/Config';
import useRequest from 'hooks/useRequest';
import ContentError from 'components/ContentError';
@ -80,15 +85,16 @@ function WorkflowJobTemplateEdit({ template }) {
};
const {
isLoading,
isLoading: isFetchUserRoleLoading,
request: fetchUserRole,
result: { orgAdminResults, isOrgAdmin },
error: contentError,
error: fetchUserRoleError,
} = useRequest(
useCallback(async () => {
const {
data: { results, count },
} = await UsersAPI.readAdminOfOrganizations(me?.id);
return { isOrgAdmin: count > 0, orgAdminResults: results };
}, [me.id]),
{ isOrgAdmin: false, orgAdminResults: null }
@ -98,11 +104,37 @@ function WorkflowJobTemplateEdit({ template }) {
fetchUserRole();
}, [fetchUserRole]);
if (contentError) {
return <ContentError error={contentError} />;
const {
isLoading: isFetchInventoryLoading,
request: fetchInventory,
result: { canChangeInventory },
error: fetchInventoryError,
} = useRequest(
useCallback(async () => {
if (template.inventory) {
const {
data: { count },
} = await InventoriesAPI.read({
role_level: 'use_role',
id: template.inventory,
});
return { canChangeInventory: count && count > 0 };
}
return { canChangeInventory: true };
}, [template.inventory]),
{ canChangeInventory: false }
);
useEffect(() => {
fetchInventory();
}, [fetchInventory]);
if (fetchUserRoleError || fetchInventoryError) {
return <ContentError error={fetchUserRoleError || fetchInventoryError} />;
}
if (isLoading || !orgAdminResults) {
if (isFetchUserRoleLoading || isFetchInventoryLoading || !orgAdminResults) {
return <ContentLoading />;
}
@ -114,6 +146,7 @@ function WorkflowJobTemplateEdit({ template }) {
template={template}
submitError={formSubmitError}
isOrgAdmin={isOrgAdmin}
isInventoryDisabled={!canChangeInventory}
/>
</CardBody>
);

View File

@ -39,6 +39,7 @@ function WorkflowJobTemplateForm({
handleCancel,
submitError,
isOrgAdmin,
isInventoryDisabled,
}) {
const helpText = getHelpText();
const { setFieldValue, setFieldTouched } = useFormikContext();
@ -150,6 +151,7 @@ function WorkflowJobTemplateForm({
onChange={handleInventoryUpdate}
touched={inventoryMeta.touched}
error={inventoryMeta.error}
isDisabled={isInventoryDisabled}
/>
</FormGroup>
<FieldWithPrompt
@ -284,6 +286,7 @@ WorkflowJobTemplateForm.propTypes = {
handleCancel: PropTypes.func.isRequired,
submitError: shape({}),
isOrgAdmin: PropTypes.bool,
isInventoryDisabled: PropTypes.bool,
};
WorkflowJobTemplateForm.defaultProps = {
@ -295,6 +298,7 @@ WorkflowJobTemplateForm.defaultProps = {
project: undefined,
},
isOrgAdmin: false,
isInventoryDisabled: false,
};
const FormikApp = withFormik({