diff --git a/awx/ui/client/src/controllers/Credentials.js b/awx/ui/client/src/controllers/Credentials.js
index aed17aee32..11e2b4e435 100644
--- a/awx/ui/client/src/controllers/Credentials.js
+++ b/awx/ui/client/src/controllers/Credentials.js
@@ -14,9 +14,14 @@
export function CredentialsList($scope, $rootScope, $location, $log,
$stateParams, Rest, Alert, CredentialList, GenerateList, Prompt, SearchInit,
PaginateInit, ReturnToCaller, ClearScope, ProcessErrors, GetBasePath,
- SelectionInit, GetChoices, Wait, $state, $filter) {
+ SelectionInit, GetChoices, Wait, $state, $filter, rbacUiControlService) {
ClearScope();
+ rbacUiControlService.canAdd('credentials')
+ .then(function(canAdd) {
+ $scope.canAdd = canAdd;
+ });
+
Wait('start');
var list = CredentialList,
@@ -129,7 +134,7 @@ CredentialsList.$inject = ['$scope', '$rootScope', '$location', '$log',
'$stateParams', 'Rest', 'Alert', 'CredentialList', 'generateList', 'Prompt',
'SearchInit', 'PaginateInit', 'ReturnToCaller', 'ClearScope',
'ProcessErrors', 'GetBasePath', 'SelectionInit', 'GetChoices', 'Wait',
- '$state', '$filter'
+ '$state', '$filter', 'rbacUiControlService'
];
@@ -349,6 +354,12 @@ export function CredentialsEdit($scope, $rootScope, $compile, $location, $log,
generator.reset();
$scope.id = id;
+ $scope.$watch('credential_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
$scope.canShareCredential = false;
if ($rootScope.current_user.is_superuser) {
diff --git a/awx/ui/client/src/controllers/Projects.js b/awx/ui/client/src/controllers/Projects.js
index 6c882cdd13..f5db4a2b8c 100644
--- a/awx/ui/client/src/controllers/Projects.js
+++ b/awx/ui/client/src/controllers/Projects.js
@@ -574,6 +574,12 @@ export function ProjectsEdit($scope, $rootScope, $compile, $location, $log,
ClearScope('htmlTemplate');
+ $scope.$watch('project_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
// Inject dynamic view
var form = ProjectsForm(),
generator = GenerateForm,
diff --git a/awx/ui/client/src/controllers/Teams.js b/awx/ui/client/src/controllers/Teams.js
index ca30f84699..aded8e5824 100644
--- a/awx/ui/client/src/controllers/Teams.js
+++ b/awx/ui/client/src/controllers/Teams.js
@@ -223,6 +223,12 @@ export function TeamsEdit($scope, $rootScope, $location,
$scope.team_id = id;
+ $scope.$watch('team_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
generator.inject(form, { mode: 'edit', related: true, scope: $scope });
generator.reset();
diff --git a/awx/ui/client/src/controllers/Users.js b/awx/ui/client/src/controllers/Users.js
index 0a00ed97c3..eb55a1bbb2 100644
--- a/awx/ui/client/src/controllers/Users.js
+++ b/awx/ui/client/src/controllers/Users.js
@@ -294,6 +294,12 @@ export function UsersEdit($scope, $rootScope, $location,
$scope.user_type = user_type_options[0];
$scope.$watch('user_type', user_type_sync($scope));
+ $scope.$watch('user_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
var setScopeFields = function(data){
_(data)
.pick(function(value, key){
diff --git a/awx/ui/client/src/forms/Credentials.js b/awx/ui/client/src/forms/Credentials.js
index c75f30c8be..abcbbd476d 100644
--- a/awx/ui/client/src/forms/Credentials.js
+++ b/awx/ui/client/src/forms/Credentials.js
@@ -33,14 +33,14 @@ export default
addRequired: true,
editRequired: true,
autocomplete: false,
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
type: 'text',
addRequired: false,
editRequired: false,
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
organization: {
addRequired: false,
@@ -55,7 +55,7 @@ export default
dataTitle: 'Organization ',
dataPlacement: 'bottom',
dataContainer: "body",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
kind: {
label: 'Type',
@@ -87,7 +87,7 @@ export default
dataPlacement: 'right',
dataContainer: "body",
hasSubForm: true,
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
access_key: {
label: 'Access Key',
@@ -100,13 +100,13 @@ export default
autocomplete: false,
apiField: 'username',
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
secret_key: {
label: 'Secret Key',
type: 'sensitive',
ngShow: "kind.value == 'aws'",
- ngDisabled: "secret_key_ask || !credential_obj.summary_fields.user_capabilities.edit",
+ ngDisabled: "secret_key_ask || !(credential_obj.summary_fields.user_capabilities.edit || canAdd)",
awRequiredWhen: {
reqExpression: "aws_required",
init: false
@@ -129,7 +129,7 @@ export default
dataPlacement: 'right',
dataContainer: "body",
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"host": {
labelBind: 'hostLabel',
@@ -146,7 +146,7 @@ export default
init: false
},
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"subscription": {
label: "Subscription ID",
@@ -164,7 +164,7 @@ export default
dataPlacement: 'right',
dataContainer: "body",
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"username": {
labelBind: 'usernameLabel',
@@ -177,7 +177,7 @@ export default
},
autocomplete: false,
subForm: "credentialSubForm",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"email_address": {
labelBind: 'usernameLabel',
@@ -193,7 +193,7 @@ export default
dataPlacement: 'right',
dataContainer: "body",
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"api_key": {
label: 'API Key',
@@ -207,7 +207,7 @@ export default
hasShowInputButton: true,
clear: false,
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"password": {
labelBind: 'passwordLabel',
@@ -221,13 +221,13 @@ export default
init: false
},
subForm: "credentialSubForm",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"ssh_password": {
label: 'Password',
type: 'sensitive',
ngShow: "kind.value == 'ssh'",
- ngDisabled: "ssh_password_ask || !credential_obj.summary_fields.user_capabilities.edit",
+ ngDisabled: "ssh_password_ask || !(credential_obj.summary_fields.user_capabilities.edit || canAdd)",
addRequired: false,
editRequired: false,
subCheckbox: {
@@ -260,7 +260,7 @@ export default
dataPlacement: 'right',
dataContainer: "body",
subForm: "credentialSubForm",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"ssh_key_unlock": {
label: 'Private Key Passphrase',
@@ -268,7 +268,7 @@ export default
ngShow: "kind.value == 'ssh' || kind.value == 'scm'",
addRequired: false,
editRequired: false,
- ngDisabled: "keyEntered === false || ssh_key_unlock_ask || !credential_obj.summary_fields.user_capabilities.edit",
+ ngDisabled: "keyEntered === false || ssh_key_unlock_ask || !(credential_obj.summary_fields.user_capabilities.edit || canAdd)",
subCheckbox: {
variable: 'ssh_key_unlock_ask',
ngShow: "kind.value == 'ssh'",
@@ -292,7 +292,7 @@ export default
dataPlacement: 'right',
dataContainer: "body",
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"become_username": {
labelBind: 'becomeUsernameLabel',
@@ -302,13 +302,13 @@ export default
editRequired: false,
autocomplete: false,
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"become_password": {
labelBind: 'becomePasswordLabel',
type: 'sensitive',
ngShow: "(kind.value == 'ssh' && (become_method && become_method.value)) ",
- ngDisabled: "become_password_ask || !credential_obj.summary_fields.user_capabilities.edit",
+ ngDisabled: "become_password_ask || !(credential_obj.summary_fields.user_capabilities.edit || canAdd)",
addRequired: false,
editRequired: false,
subCheckbox: {
@@ -325,7 +325,7 @@ export default
label: 'Client ID',
subForm: 'credentialSubForm',
ngShow: "kind.value === 'azure_rm'",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
secret:{
type: 'sensitive',
@@ -334,14 +334,14 @@ export default
label: 'Client Secret',
subForm: 'credentialSubForm',
ngShow: "kind.value === 'azure_rm'",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
tenant: {
type: 'text',
label: 'Tenant ID',
subForm: 'credentialSubForm',
ngShow: "kind.value === 'azure_rm'",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
authorize: {
label: 'Authorize',
@@ -349,7 +349,7 @@ export default
ngChange: "toggleCallback('host_config_key')",
subForm: 'credentialSubForm',
ngShow: "kind.value === 'net'",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
authorize_password: {
label: 'Authorize Password',
@@ -358,7 +358,7 @@ export default
autocomplete: false,
subForm: 'credentialSubForm',
ngShow: "authorize && authorize !== 'false'",
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"project": {
labelBind: 'projectLabel',
@@ -376,7 +376,7 @@ export default
init: false
},
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"domain": {
labelBind: 'domainLabel',
@@ -393,13 +393,13 @@ export default
addRequired: false,
editRequired: false,
subForm: 'credentialSubForm',
- ngDisabled: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
"vault_password": {
label: "Vault Password",
type: 'sensitive',
ngShow: "kind.value == 'ssh'",
- ngDisabled: "vault_password_ask || !credential_obj.summary_fields.user_capabilities.edit",
+ ngDisabled: "vault_password_ask || !(credential_obj.summary_fields.user_capabilities.edit || canAdd)",
addRequired: false,
editRequired: false,
subCheckbox: {
@@ -416,17 +416,17 @@ export default
buttons: {
cancel: {
ngClick: 'formCancel()',
- ngShow: 'credential_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!credential_obj.summary_fields.user_capabilities.edit'
+ ngShow: '!(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
label: 'Save',
ngClick: 'formSave()', //$scope.function to call on click, optional
ngDisabled: true,
- ngShow: 'credential_obj.summary_fields.user_capabilities.edit' //Disable when $pristine or $invalid, optional
+ ngShow: '(credential_obj.summary_fields.user_capabilities.edit || canAdd)' //Disable when $pristine or $invalid, optional
}
},
@@ -450,7 +450,7 @@ export default
awToolTip: 'Add a permission',
actionClass: 'btn List-buttonSubmit',
buttonContent: '+ ADD',
- ngShow: 'credential_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(credential_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/forms/Groups.js b/awx/ui/client/src/forms/Groups.js
index 40a5cd3301..32723ff5f2 100644
--- a/awx/ui/client/src/forms/Groups.js
+++ b/awx/ui/client/src/forms/Groups.js
@@ -27,7 +27,7 @@ export default
addRequired: true,
editRequired: true,
tab: 'properties',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
@@ -35,7 +35,7 @@ export default
addRequired: false,
editRequired: false,
tab: 'properties',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
variables: {
label: 'Variables',
@@ -68,7 +68,7 @@ export default
addRequired: false,
editRequired: false,
ngModel: 'source',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
credential: {
label: 'Cloud Credential',
@@ -81,7 +81,7 @@ export default
reqExpression: "cloudCredentialRequired",
init: "false"
},
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
source_regions: {
label: 'Regions',
@@ -97,7 +97,7 @@ export default
"or choose All to include all regions. Tower will only be updated with Hosts associated with the selected regions." +
"
",
dataContainer: 'body',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
instance_filters: {
label: 'Instance Filters',
@@ -118,7 +118,7 @@ export default
"View the Describe Instances documentation " +
"for a complete list of supported filters.
",
dataContainer: 'body',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
group_by: {
label: 'Only Group By',
@@ -144,7 +144,7 @@ export default
"Tag None: tags » tag_none " +
"If blank, all groups above are created except Instance ID .
",
dataContainer: 'body',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
inventory_script: {
label : "Custom Inventory Script",
@@ -156,7 +156,7 @@ export default
addRequired: true,
editRequired: true,
ngRequired: "source && source.value === 'custom'",
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit',
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)',
},
custom_variables: {
id: 'custom_variables',
@@ -278,7 +278,7 @@ export default
dataContainer: 'body',
dataPlacement: 'right',
labelClass: 'checkbox-options',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
}, {
name: 'overwrite_vars',
label: 'Overwrite Variables',
@@ -293,7 +293,7 @@ export default
dataContainer: 'body',
dataPlacement: 'right',
labelClass: 'checkbox-options',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
}, {
name: 'update_on_launch',
label: 'Update on Launch',
@@ -307,7 +307,7 @@ export default
dataContainer: 'body',
dataPlacement: 'right',
labelClass: 'checkbox-options',
- ngDisabled: '!group_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
}]
},
update_cache_timeout: {
@@ -333,16 +333,16 @@ export default
buttons: {
cancel: {
ngClick: 'formCancel()',
- ngShow: 'group_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!group_obj.summary_fields.user_capabilities.edit'
+ ngShow: '!(group_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()',
ngDisabled: true,
- ngShow: 'group_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(group_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/forms/Hosts.js b/awx/ui/client/src/forms/Hosts.js
index 3f01a6cf5c..a1c0e69537 100644
--- a/awx/ui/client/src/forms/Hosts.js
+++ b/awx/ui/client/src/forms/Hosts.js
@@ -47,14 +47,14 @@ export default
dataTitle: 'Host Name',
dataPlacement: 'right',
dataContainer: 'body',
- ngDisabled: '!host.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
type: 'text',
addRequired: false,
editRequired: false,
- ngDisabled: '!host.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(host.summary_fields.user_capabilities.edit || canAdd)'
},
variables: {
label: 'Variables',
@@ -85,16 +85,16 @@ export default
buttons: {
cancel: {
ngClick: 'formCancel()',
- ngShow: 'host.summary_fields.user_capabilities.edit'
+ ngShow: '(host.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!host.summary_fields.user_capabilities.edit'
+ ngShow: '!(host.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()',
ngDisabled: true,
- ngShow: 'host.summary_fields.user_capabilities.edit'
+ ngShow: '(host.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/forms/Inventories.js b/awx/ui/client/src/forms/Inventories.js
index 425c4d342d..72852079c3 100644
--- a/awx/ui/client/src/forms/Inventories.js
+++ b/awx/ui/client/src/forms/Inventories.js
@@ -27,7 +27,7 @@ export default
addRequired: true,
editRequired: true,
capitalize: false,
- ngDisabled: '!inventory_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)'
},
inventory_description: {
realName: 'description',
@@ -35,7 +35,7 @@ export default
type: 'text',
addRequired: false,
editRequired: false,
- ngDisabled: '!inventory_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)'
},
organization: {
label: 'Organization',
@@ -47,7 +47,7 @@ export default
reqExpression: "organizationrequired",
init: "true"
},
- ngDisabled: '!inventory_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)'
},
variables: {
label: 'Variables',
@@ -67,23 +67,23 @@ export default
dataTitle: 'Inventory Variables',
dataPlacement: 'right',
dataContainer: 'body',
- ngDisabled: '!inventory_obj.summary_fields.user_capabilities.edit' // TODO: get working
+ ngDisabled: '!(inventory_obj.summary_fields.user_capabilities.edit || canAdd)' // TODO: get working
}
},
buttons: {
cancel: {
ngClick: 'formCancel()',
- ngShow: 'inventory_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngHide: 'inventory_obj.summary_fields.user_capabilities.edit'
+ ngHide: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()',
ngDisabled: true,
- ngShow: 'inventory_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
@@ -105,7 +105,7 @@ export default
awToolTip: 'Add a permission',
actionClass: 'btn List-buttonSubmit',
buttonContent: '+ ADD',
- ngShow: 'inventory_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(inventory_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/forms/JobTemplates.js b/awx/ui/client/src/forms/JobTemplates.js
index 13e826492d..e9fe0553b8 100644
--- a/awx/ui/client/src/forms/JobTemplates.js
+++ b/awx/ui/client/src/forms/JobTemplates.js
@@ -28,7 +28,7 @@ export default
addRequired: true,
editRequired: true,
column: 1,
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
@@ -36,7 +36,7 @@ export default
addRequired: false,
editRequired: false,
column: 1,
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
job_type: {
label: 'Job Type',
@@ -59,7 +59,7 @@ export default
ngShow: "!job_type.value || job_type.value !== 'scan'",
text: 'Prompt on launch'
},
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
inventory: {
label: 'Inventory',
@@ -82,7 +82,7 @@ export default
ngShow: "!job_type.value || job_type.value !== 'scan'",
text: 'Prompt on launch'
},
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
project: {
label: 'Project',
@@ -104,13 +104,13 @@ export default
dataTitle: 'Project',
dataPlacement: 'right',
dataContainer: "body",
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
playbook: {
label: 'Playbook',
type:'select',
ngOptions: 'book for book in playbook_options track by book',
- ngDisabled: "(job_type.value === 'scan' && project_name === 'Default') || !job_template_obj.summary_fields.user_capabilities.edit",
+ ngDisabled: "(job_type.value === 'scan' && project_name === 'Default') || !(job_template_obj.summary_fields.user_capabilities.edit || canAdd)",
id: 'playbook-select',
awRequiredWhen: {
reqExpression: "playbookrequired",
@@ -144,7 +144,7 @@ export default
variable: 'ask_credential_on_launch',
text: 'Prompt on launch'
},
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
cloud_credential: {
label: 'Cloud Credential',
@@ -160,7 +160,7 @@ export default
dataTitle: 'Cloud Credential',
dataPlacement: 'right',
dataContainer: "body",
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
network_credential: {
label: 'Network Credential',
@@ -175,7 +175,7 @@ export default
dataTitle: 'Network Credential',
dataPlacement: 'right',
dataContainer: "body",
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
forks: {
label: 'Forks',
@@ -195,7 +195,7 @@ export default
dataTitle: 'Forks',
dataPlacement: 'right',
dataContainer: "body",
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit' // TODO: get working
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)' // TODO: get working
},
limit: {
label: 'Limit',
@@ -213,7 +213,7 @@ export default
variable: 'ask_limit_on_launch',
text: 'Prompt on launch'
},
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
verbosity: {
label: 'Verbosity',
@@ -227,7 +227,7 @@ export default
dataTitle: 'Verbosity',
dataPlacement: 'right',
dataContainer: "body",
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
job_tags: {
label: 'Job Tags',
@@ -247,7 +247,7 @@ export default
variable: 'ask_tags_on_launch',
text: 'Prompt on launch'
},
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
skip_tags: {
label: 'Skip Tags',
@@ -267,7 +267,7 @@ export default
variable: 'ask_skip_tags_on_launch',
text: 'Prompt on launch'
},
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
checkbox_group: {
label: 'Options',
@@ -284,7 +284,7 @@ export default
dataTitle: 'Become Privilege Escalation',
dataContainer: "body",
labelClass: 'stack-inline',
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
}, {
name: 'allow_callbacks',
label: 'Allow Provisioning Callbacks',
@@ -299,7 +299,7 @@ export default
dataTitle: 'Allow Provisioning Callbacks',
dataContainer: "body",
labelClass: 'stack-inline',
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
}]
},
callback_url: {
@@ -315,7 +315,7 @@ export default
dataPlacement: 'top',
dataTitle: 'Provisioning Callback URL',
dataContainer: "body",
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
host_config_key: {
label: 'Host Config Key',
@@ -329,7 +329,7 @@ export default
dataPlacement: 'right',
dataTitle: "Host Config Key",
dataContainer: "body",
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
labels: {
label: 'Labels',
@@ -343,7 +343,7 @@ export default
dataPlacement: 'right',
awPopOver: "Optional labels that describe this job template, such as 'dev' or 'test'. Labels can be used to group and filter job templates and completed jobs in the Tower display.
",
dataContainer: 'body',
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
variables: {
label: 'Extra Variables',
@@ -367,14 +367,14 @@ export default
variable: 'ask_variables_on_launch',
text: 'Prompt on launch'
},
- ngDisabled: '!job_template_obj.summary_fields.user_capabilities.edit' // TODO: get working
+ ngDisabled: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)' // TODO: get working
}
},
buttons: { //for now always generates tags
add_survey: {
ngClick: 'addSurvey()',
- ngShow: 'job_type.value !== "scan" && !survey_exists && job_template_obj.summary_fields.user_capabilities.edit',
+ ngShow: 'job_type.value !== "scan" && !survey_exists && (job_template_obj.summary_fields.user_capabilities.edit || canAdd)',
awFeature: 'surveys',
awToolTip: 'Surveys allow users to be prompted at job launch with a series of questions related to the job. This allows for variables to be defined that affect the playbook run at time of launch.',
dataPlacement: 'top'
@@ -382,25 +382,25 @@ export default
edit_survey: {
ngClick: 'editSurvey()',
awFeature: 'surveys',
- ngShow: 'job_type.value !== "scan" && survey_exists && job_template_obj.summary_fields.user_capabilities.edit'
+ ngShow: 'job_type.value !== "scan" && survey_exists && (job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
view_survey: {
ngClick: 'editSurvey()',
awFeature: 'surveys',
- ngShow: 'job_type.value !== "scan" && survey_exists && !job_template_obj.summary_fields.user_capabilities.edit'
+ ngShow: 'job_type.value !== "scan" && survey_exists && !(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
cancel: {
ngClick: 'formCancel()',
- ngShow: 'job_template_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!job_template_obj.summary_fields.user_capabilities.edit'
+ ngShow: '!(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()', //$scope.function to call on click, optional
ngDisabled: "job_templates_form.$invalid || can_edit!==true",//true //Disable when $pristine or $invalid, optional and when can_edit = false, for permission reasons
- ngShow: 'job_template_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
@@ -425,7 +425,7 @@ export default
awToolTip: 'Add a permission',
actionClass: 'btn List-buttonSubmit',
buttonContent: '+ ADD',
- ngShow: 'job_template_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(job_template_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/forms/Organizations.js b/awx/ui/client/src/forms/Organizations.js
index daf3e7d5f0..377d5a911e 100644
--- a/awx/ui/client/src/forms/Organizations.js
+++ b/awx/ui/client/src/forms/Organizations.js
@@ -26,30 +26,30 @@ export default
addRequired: true,
editRequired: true,
capitalize: false,
- ngDisabled: '!organization_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(organization_obj.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
type: 'text',
addRequired: false,
editRequired: false,
- ngDisabled: '!organization_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(organization_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
buttons: { //for now always generates tags
cancel: {
ngClick: 'formCancel()',
- ngShow: 'organization_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(organization_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!organization_obj.summary_fields.user_capabilities.edit'
+ ngShow: '!(organization_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()', //$scope.function to call on click, optional
ngDisabled: true,
- ngShow: 'organization_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(organization_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
@@ -71,7 +71,7 @@ export default
awToolTip: 'Add a permission',
actionClass: 'btn List-buttonSubmit',
buttonContent: '+ ADD',
- ngShow: 'organization_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(organization_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/forms/Projects.js b/awx/ui/client/src/forms/Projects.js
index b77f234f06..409386b348 100644
--- a/awx/ui/client/src/forms/Projects.js
+++ b/awx/ui/client/src/forms/Projects.js
@@ -31,14 +31,14 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
addRequired: true,
editRequired: true,
capitalize: false,
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
type: 'text',
addRequired: false,
editRequired: false,
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
organization: {
label: 'Organization',
@@ -53,7 +53,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
dataTitle: 'Organization',
dataContainer: 'body',
dataPlacement: 'right',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
scm_type: {
label: 'SCM Type',
@@ -64,7 +64,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
addRequired: true,
editRequired: true,
hasSubForm: true,
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
missing_path_alert: {
type: 'alertblock',
@@ -87,7 +87,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
dataTitle: 'Project Base Path',
dataContainer: 'body',
dataPlacement: 'right',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
local_path: {
label: 'Playbook Directory',
@@ -105,7 +105,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
dataTitle: 'Project Path',
dataContainer: 'body',
dataPlacement: 'right',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
scm_url: {
label: 'SCM URL',
@@ -122,7 +122,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
dataTitle: 'SCM URL',
dataContainer: 'body',
dataPlacement: 'right',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
scm_branch: {
labelBind: "scmBranchLabel",
@@ -131,7 +131,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
addRequired: false,
editRequired: false,
subForm: 'sourceSubForm',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
credential: {
label: 'SCM Credential',
@@ -143,7 +143,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
addRequired: false,
editRequired: false,
subForm: 'sourceSubForm',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
checkbox_group: {
label: 'SCM Update Options',
@@ -161,7 +161,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
dataContainer: 'body',
dataPlacement: 'right',
labelClass: 'checkbox-options stack-inline',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
}, {
name: 'scm_delete_on_update',
label: 'Delete on Update',
@@ -174,7 +174,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
dataContainer: 'body',
dataPlacement: 'right',
labelClass: 'checkbox-options stack-inline',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
}, {
name: 'scm_update_on_launch',
label: 'Update on Launch',
@@ -186,7 +186,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
dataContainer: 'body',
dataPlacement: 'right',
labelClass: 'checkbox-options stack-inline',
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
}]
},
scm_update_cache_timeout: {
@@ -206,23 +206,23 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
dataTitle: 'Cache Timeout',
dataPlacement: 'right',
dataContainer: "body",
- ngDisabled: '!project_obj.summary_fields.user_capabilities.edit' // TODO: get working
+ ngDisabled: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)' // TODO: get working
}
},
buttons: {
cancel: {
ngClick: 'formCancel()',
- ngShow: 'project_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!project_obj.summary_fields.user_capabilities.edit'
+ ngShow: '!(project_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()',
ngDisabled: true,
- ngShow: 'project_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(project_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
@@ -244,7 +244,7 @@ angular.module('ProjectFormDefinition', ['SchedulesListDefinition'])
awToolTip: 'Add a permission',
actionClass: 'btn List-buttonSubmit',
buttonContent: '+ ADD',
- ngShow: 'project_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(project_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/forms/Teams.js b/awx/ui/client/src/forms/Teams.js
index 07eb88a630..6023650156 100644
--- a/awx/ui/client/src/forms/Teams.js
+++ b/awx/ui/client/src/forms/Teams.js
@@ -26,14 +26,14 @@ export default
addRequired: true,
editRequired: true,
capitalize: false,
- ngDisabled: '!team_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(team_obj.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
type: 'text',
addRequired: false,
editRequired: false,
- ngDisabled: '!team_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(team_obj.summary_fields.user_capabilities.edit || canAdd)'
},
organization: {
label: 'Organization',
@@ -47,23 +47,23 @@ export default
reqExpression: "orgrequired",
init: true
},
- ngDisabled: '!team_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(team_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
buttons: {
cancel: {
ngClick: 'formCancel()',
- ngShow: 'team_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(team_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!team_obj.summary_fields.user_capabilities.edit'
+ ngShow: '!(team_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()',
ngDisabled: true,
- ngShow: 'team_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(team_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
@@ -85,7 +85,7 @@ export default
awToolTip: 'Add user to team',
actionClass: 'btn List-buttonSubmit',
buttonContent: '+ ADD',
- ngShow: 'team_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(team_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/forms/Users.js b/awx/ui/client/src/forms/Users.js
index 769eebe76e..a93e549cae 100644
--- a/awx/ui/client/src/forms/Users.js
+++ b/awx/ui/client/src/forms/Users.js
@@ -27,7 +27,7 @@ export default
addRequired: true,
editRequired: true,
capitalize: true,
- ngDisabled: '!user_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
last_name: {
label: 'Last Name',
@@ -35,7 +35,7 @@ export default
addRequired: true,
editRequired: true,
capitalize: true,
- ngDisabled: '!user_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
email: {
label: 'Email',
@@ -43,7 +43,7 @@ export default
addRequired: true,
editRequired: true,
autocomplete: false,
- ngDisabled: '!user_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
username: {
label: 'Username',
@@ -53,7 +53,7 @@ export default
init: true
},
autocomplete: false,
- ngDisabled: '!user_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
organization: {
label: 'Organization',
@@ -68,7 +68,7 @@ export default
reqExpression: "orgrequired",
init: true
},
- ngDisabled: '!user_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
password: {
label: 'Password',
@@ -80,7 +80,7 @@ export default
ngChange: "clearPWConfirm('password_confirm')",
autocomplete: false,
chkPass: true,
- ngDisabled: '!user_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
password_confirm: {
label: 'Confirm Password',
@@ -92,7 +92,7 @@ export default
awPassMatch: true,
associated: 'password',
autocomplete: false,
- ngDisabled: '!user_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
user_type: {
label: 'User Type',
@@ -101,23 +101,23 @@ export default
disableChooseOption: true,
ngModel: 'user_type',
ngShow: 'current_user["is_superuser"]',
- ngDisabled: '!user_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
},
buttons: {
cancel: {
ngClick: 'formCancel()',
- ngShow: 'user_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!user_obj.summary_fields.user_capabilities.edit'
+ ngShow: '!(user_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()',
ngDisabled: true,
- ngShow: 'user_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(user_obj.summary_fields.user_capabilities.edit || canAdd)'
}
},
diff --git a/awx/ui/client/src/inventories/edit/inventory-edit.controller.js b/awx/ui/client/src/inventories/edit/inventory-edit.controller.js
index 8b01b8be3e..fd59e1961e 100644
--- a/awx/ui/client/src/inventories/edit/inventory-edit.controller.js
+++ b/awx/ui/client/src/inventories/edit/inventory-edit.controller.js
@@ -31,6 +31,13 @@ function InventoriesEdit($scope, $rootScope, $compile, $location,
form.formLabelSize = null;
form.formFieldSize = null;
$scope.inventory_id = inventory_id;
+
+ $scope.$watch('invnentory_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
generator.inject(form, { mode: 'edit', related: true, scope: $scope });
generator.reset();
diff --git a/awx/ui/client/src/inventories/manage/groups/groups-edit.controller.js b/awx/ui/client/src/inventories/manage/groups/groups-edit.controller.js
index c6ec30bd06..5f9d6cb387 100644
--- a/awx/ui/client/src/inventories/manage/groups/groups-edit.controller.js
+++ b/awx/ui/client/src/inventories/manage/groups/groups-edit.controller.js
@@ -18,6 +18,12 @@
CredentialList = _.cloneDeep(CredentialList);
CredentialList.fields.kind.noSearch = true;
+ $scope.$watch('group_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
$scope.formCancel = function(){
$state.go('^');
};
diff --git a/awx/ui/client/src/inventories/manage/hosts/hosts-edit.controller.js b/awx/ui/client/src/inventories/manage/hosts/hosts-edit.controller.js
index 86ad43d791..94e7b69c23 100644
--- a/awx/ui/client/src/inventories/manage/hosts/hosts-edit.controller.js
+++ b/awx/ui/client/src/inventories/manage/hosts/hosts-edit.controller.js
@@ -5,10 +5,17 @@
*************************************************/
export default
- ['$state', '$stateParams', '$scope', 'HostForm', 'ParseTypeChange', 'GenerateForm', 'HostManageService', 'host', 'GetBasePath', 'Rest',
- function($state, $stateParams, $scope, HostForm, ParseTypeChange, GenerateForm, HostManageService, host, GetBasePath, Rest){
+ ['$state', '$stateParams', '$scope', 'HostForm', 'ParseTypeChange', 'GenerateForm', 'HostManageService', 'host',
+ function($state, $stateParams, $scope, HostForm, ParseTypeChange, GenerateForm, HostManageService, host){
var generator = GenerateForm,
form = HostForm;
+
+ $scope.$watch('host.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
$scope.parseType = 'yaml';
$scope.formCancel = function(){
$state.go('^');
diff --git a/awx/ui/client/src/inventory-scripts/edit/edit.controller.js b/awx/ui/client/src/inventory-scripts/edit/edit.controller.js
index 33cc50ca2e..2c1ee236df 100644
--- a/awx/ui/client/src/inventory-scripts/edit/edit.controller.js
+++ b/awx/ui/client/src/inventory-scripts/edit/edit.controller.js
@@ -25,6 +25,13 @@ export default
url = GetBasePath('inventory_scripts');
$scope.inventory_script = inventory_script;
+
+ $scope.$watch('inventory_script_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
generator.inject(form, {
mode: 'edit' ,
scope:$scope,
diff --git a/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js b/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js
index fd8ecd9023..c2a9e7ca3b 100644
--- a/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js
+++ b/awx/ui/client/src/inventory-scripts/inventory-scripts.form.js
@@ -25,14 +25,14 @@ export default function() {
addRequired: true,
editRequired: true,
capitalize: false,
- ngDisabled: '!inventory_script_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
type: 'text',
addRequired: false,
editRequired: false,
- ngDisabled: '!inventory_script_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)'
},
organization: {
label: 'Organization',
@@ -44,7 +44,7 @@ export default function() {
sourceModel: 'organization',
sourceField: 'name',
ngClick: 'lookUpOrganization()',
- ngDisabled: '!inventory_script_obj.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)'
},
script: {
label: 'Custom Script',
@@ -54,7 +54,7 @@ export default function() {
addRequired: true,
editRequired: true,
awDropFile: true,
- ngDisabled: '!inventory_script_obj.summary_fields.user_capabilities.edit',
+ ngDisabled: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)',
rows: 10,
awPopOver: "Drag and drop your custom inventory script file here or create one in the field to import your custom inventory. " +
" Script must begin with a hashbang sequence: i.e.... #!/usr/bin/env python
",
@@ -67,16 +67,16 @@ export default function() {
buttons: { //for now always generates tags
cancel: {
ngClick: 'formCancel()',
- ngShow: 'inventory_script_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!inventory_script_obj.summary_fields.user_capabilities.edit'
+ ngShow: '!(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()', //$scope.function to call on click, optional
ngDisabled: 'custom_inventory_form.$pristine || custom_inventory_form.$invalid || !canEdit', //Disable when $pristine or $invalid, optional
- ngShow: 'inventory_script_obj.summary_fields.user_capabilities.edit'
+ ngShow: '(inventory_script_obj.summary_fields.user_capabilities.edit || canAdd)'
}
}
};
diff --git a/awx/ui/client/src/job-templates/edit/job-templates-edit.controller.js b/awx/ui/client/src/job-templates/edit/job-templates-edit.controller.js
index c30412504a..2bb0929cd4 100644
--- a/awx/ui/client/src/job-templates/edit/job-templates-edit.controller.js
+++ b/awx/ui/client/src/job-templates/edit/job-templates-edit.controller.js
@@ -36,6 +36,12 @@ export default
ClearScope();
+ $scope.$watch('job_template_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
var defaultUrl = GetBasePath('job_templates'),
generator = GenerateForm,
form = JobTemplateForm(),
diff --git a/awx/ui/client/src/notifications/edit/edit.controller.js b/awx/ui/client/src/notifications/edit/edit.controller.js
index 44c50a71ce..0733096f83 100644
--- a/awx/ui/client/src/notifications/edit/edit.controller.js
+++ b/awx/ui/client/src/notifications/edit/edit.controller.js
@@ -26,6 +26,13 @@ export default
url = GetBasePath('notification_templates');
$scope.notification_template = notification_template;
+
+ $scope.$watch('notification_template.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
generator.inject(form, {
mode: 'edit' ,
scope:$scope,
diff --git a/awx/ui/client/src/notifications/notificationTemplates.form.js b/awx/ui/client/src/notifications/notificationTemplates.form.js
index 69128bbb18..b796bb5ae2 100644
--- a/awx/ui/client/src/notifications/notificationTemplates.form.js
+++ b/awx/ui/client/src/notifications/notificationTemplates.form.js
@@ -28,14 +28,14 @@ export default function() {
addRequired: true,
editRequired: true,
capitalize: false,
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
description: {
label: 'Description',
type: 'text',
addRequired: false,
editRequired: false,
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
organization: {
label: 'Organization',
@@ -47,7 +47,7 @@ export default function() {
reqExpression: "organizationrequired",
init: "true"
},
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
notification_type: {
label: 'Type',
@@ -58,14 +58,14 @@ export default function() {
ngOptions: 'type.label for type in notification_type_options track by type.value',
ngChange: 'typeChange()',
hasSubForm: true,
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
username: {
label: 'Username',
type: 'text',
ngShow: "notification_type.value == 'email' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
host: {
@@ -77,7 +77,7 @@ export default function() {
},
ngShow: "notification_type.value == 'email' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
sender: {
label: 'Sender Email',
@@ -88,7 +88,7 @@ export default function() {
},
ngShow: "notification_type.value == 'email' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
recipients: {
label: 'Recipient List',
@@ -105,7 +105,7 @@ export default function() {
},
ngShow: "notification_type.value == 'email' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
password: {
labelBind: 'passwordLabel',
@@ -117,7 +117,7 @@ export default function() {
},
ngShow: "notification_type.value == 'email' || notification_type.value == 'irc' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
port: {
labelBind: 'portLabel',
@@ -132,7 +132,7 @@ export default function() {
},
ngShow: "notification_type.value == 'email' || notification_type.value == 'irc'",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
channels: {
label: 'Destination Channels',
@@ -149,7 +149,7 @@ export default function() {
},
ngShow: "notification_type.value == 'slack'",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
rooms: {
label: 'Destination Channels',
@@ -166,7 +166,7 @@ export default function() {
},
ngShow: "notification_type.value == 'hipchat'",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
token: {
labelBind: 'tokenLabel',
@@ -178,7 +178,7 @@ export default function() {
},
ngShow: "notification_type.value == 'slack' || notification_type.value == 'pagerduty' || notification_type.value == 'hipchat'",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
account_token: {
label: 'Account Token',
@@ -190,7 +190,7 @@ export default function() {
},
ngShow: "notification_type.value == 'twilio' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
from_number: {
label: 'Source Phone Number',
@@ -203,7 +203,7 @@ export default function() {
},
ngShow: "notification_type.value == 'twilio' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
to_numbers: {
label: 'Destination SMS Number',
@@ -220,7 +220,7 @@ export default function() {
},
ngShow: "notification_type.value == 'twilio' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
account_sid: {
label: 'Account SID',
@@ -231,7 +231,7 @@ export default function() {
},
ngShow: "notification_type.value == 'twilio' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
subdomain: {
label: 'Pagerduty subdomain',
@@ -242,7 +242,7 @@ export default function() {
},
ngShow: "notification_type.value == 'pagerduty' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
service_key: {
label: 'API Service/Integration Key',
@@ -253,7 +253,7 @@ export default function() {
},
ngShow: "notification_type.value == 'pagerduty' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
client_name: {
label: 'Client Identifier',
@@ -264,7 +264,7 @@ export default function() {
},
ngShow: "notification_type.value == 'pagerduty' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
message_from: {
label: 'Label to be shown with notification',
@@ -275,7 +275,7 @@ export default function() {
},
ngShow: "notification_type.value == 'hipchat' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
api_url: {
label: 'API URL',
@@ -287,7 +287,7 @@ export default function() {
},
ngShow: "notification_type.value == 'hipchat' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
color: {
label: 'Notification Color',
@@ -300,14 +300,14 @@ export default function() {
},
ngShow: "notification_type.value == 'hipchat' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
notify: {
label: 'Notify Channel',
type: 'checkbox',
ngShow: "notification_type.value == 'hipchat' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
url: {
label: 'Target URL',
@@ -318,7 +318,7 @@ export default function() {
},
ngShow: "notification_type.value == 'webhook' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
headers: {
label: 'HTTP Headers',
@@ -339,7 +339,7 @@ export default function() {
dataPlacement: 'right',
ngShow: "notification_type.value == 'webhook' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
server: {
label: 'IRC Server Address',
@@ -350,7 +350,7 @@ export default function() {
},
ngShow: "notification_type.value == 'irc' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
nickname: {
label: 'IRC Nick',
@@ -361,7 +361,7 @@ export default function() {
},
ngShow: "notification_type.value == 'irc' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
targets: {
label: 'Destination Channels or Users',
@@ -378,14 +378,14 @@ export default function() {
},
ngShow: "notification_type.value == 'irc' ",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
use_ssl: {
label: 'SSL Connection',
type: 'checkbox',
ngShow: "notification_type.value == 'irc'",
subForm: 'typeSubForm',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
checkbox_group: {
label: 'Options',
@@ -398,14 +398,14 @@ export default function() {
type: 'checkbox',
ngShow: "notification_type.value == 'email' ",
labelClass: 'checkbox-options stack-inline',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
}, {
name: 'use_ssl',
label: 'Use SSL',
type: 'checkbox',
ngShow: "notification_type.value == 'email'",
labelClass: 'checkbox-options stack-inline',
- ngDisabled: '!notification_template.summary_fields.user_capabilities.edit'
+ ngDisabled: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
}]
}
},
@@ -413,15 +413,15 @@ export default function() {
buttons: { //for now always generates tags
cancel: {
ngClick: 'formCancel()',
- ngShow: 'notification_template.summary_fields.user_capabilities.edit'
+ ngShow: '(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
close: {
ngClick: 'formCancel()',
- ngShow: '!notification_template.summary_fields.user_capabilities.edit'
+ ngShow: '!(notification_template.summary_fields.user_capabilities.edit || canAdd)'
},
save: {
ngClick: 'formSave()',
- ngShow: 'notification_template.summary_fields.user_capabilities.edit', //$scope.function to call on click, optional
+ ngShow: '(notification_template.summary_fields.user_capabilities.edit || canAdd)', //$scope.function to call on click, optional
ngDisabled: true //Disable when $pristine or $invalid, optional
}
}
diff --git a/awx/ui/client/src/organizations/edit/organizations-edit.controller.js b/awx/ui/client/src/organizations/edit/organizations-edit.controller.js
index 8b63401a31..061c9df43f 100644
--- a/awx/ui/client/src/organizations/edit/organizations-edit.controller.js
+++ b/awx/ui/client/src/organizations/edit/organizations-edit.controller.js
@@ -25,6 +25,12 @@ export default ['$scope', '$rootScope', '$compile', '$location',
id = $stateParams.organization_id,
relatedSets = {};
+ $scope.$watch('organization_obj.summary_fields.user_capabilities.edit', function(val) {
+ if (val === false) {
+ $scope.canAdd = false;
+ }
+ });
+
$scope.$parent.activeMode = 'edit';
$scope.$parent.activeCard = parseInt(id);
diff --git a/awx/ui/client/src/partials/survey-maker-modal.html b/awx/ui/client/src/partials/survey-maker-modal.html
index 1ebb795bb8..4ab7dfcc83 100644
--- a/awx/ui/client/src/partials/survey-maker-modal.html
+++ b/awx/ui/client/src/partials/survey-maker-modal.html
@@ -32,13 +32,13 @@
-
+
-
+
-
+
@@ -56,13 +56,13 @@
{{question.question_description}}