Fixes bug where inventory field was erroneously disabled on WFJT form

We were disabling the field when a user did not have sufficient permissions to create an Inventory.  I updated this logic to check if a user has use permissions on the selected inventory before disabling the field.
This commit is contained in:
mabashian 2022-09-13 10:33:08 -04:00
parent 84fa19f2ad
commit cc6eaa7f44
3 changed files with 47 additions and 19 deletions

View File

@ -39,13 +39,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 +79,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 +87,6 @@ function InventoryLookup({
count: 0,
relatedSearchableKeys: [],
searchableKeys: [],
canEdit: false,
}
);
@ -129,7 +120,7 @@ function InventoryLookup({
label={t`Inventory`}
promptId={promptId}
promptName={promptName}
isDisabled={!canEdit || isDisabled}
isDisabled={isOverrideDisabled || isDisabled}
tooltip={t`Select the inventory containing the hosts
you want this job to manage.`}
>
@ -145,7 +136,7 @@ function InventoryLookup({
fieldName={fieldName}
validate={validate}
isLoading={isLoading}
isDisabled={!canEdit || isDisabled}
isDisabled={isOverrideDisabled || isDisabled}
qsConfig={QS_CONFIG}
renderOptionsList={({ state, dispatch, canDelete }) => (
<OptionsList
@ -200,7 +191,7 @@ function InventoryLookup({
onBlur={onBlur}
required={required}
isLoading={isLoading}
isDisabled={!canEdit || isDisabled}
isDisabled={isOverrideDisabled || isDisabled}
qsConfig={QS_CONFIG}
renderOptionsList={({ state, dispatch, canDelete }) => (
<OptionsList

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}
isOverrideDisabled={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({