diff --git a/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js b/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js index 39b083f06c..4a9b053cdd 100644 --- a/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js +++ b/awx/ui/client/src/access/rbac-multiselect/permissionsUsers.list.js @@ -16,6 +16,12 @@ index: false, hover: true, emptyListText : i18n._('No Users exist'), + disableRow: "{{ user.summary_fields.user_capabilities.edit === false }}", + disableRowValue: 'summary_fields.user_capabilities.edit === false', + disableTooltip: { + placement: 'top', + tipWatch: 'user.tooltip' + }, fields: { first_name: { label: i18n._('First Name'), diff --git a/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js b/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js index 8de176322c..2c3a7b9c8c 100644 --- a/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js +++ b/awx/ui/client/src/access/rbac-multiselect/rbac-multiselect-list.directive.js @@ -7,10 +7,10 @@ /* jshint unused: vars */ export default ['addPermissionsTeamsList', 'addPermissionsUsersList', 'TemplateList', 'ProjectList', 'InventoryList', 'CredentialList', '$compile', 'generateList', - 'OrganizationList', '$window', + 'OrganizationList', '$window', 'i18n', function(addPermissionsTeamsList, addPermissionsUsersList, TemplateList, ProjectList, InventoryList, CredentialList, $compile, generateList, - OrganizationList, $window) { + OrganizationList, $window, i18n) { return { restrict: 'E', scope: { @@ -159,6 +159,21 @@ export default ['addPermissionsTeamsList', 'addPermissionsUsersList', 'TemplateL // iterate over the list and add fields like type label, after the // OPTIONS request returns, or the list is sorted/paginated/searched function optionsRequestDataProcessing(){ + if(scope.list.name === 'users'){ + if (scope[list.name] !== undefined) { + scope[list.name].forEach(function(item, item_idx) { + var itm = scope[list.name][item_idx]; + if(itm.summary_fields.user_capabilities.edit){ + // undefined doesn't render the tooltip, + // which is intended here. + itm.tooltip = undefined; + } + else if(!itm.summary_fields.user_capabilities.edit){ + itm.tooltip = i18n._('You do not have permission to manage this user'); + } + }); + } + } if(scope.list.name === 'projects'){ if (scope[list.name] !== undefined) { scope[list.name].forEach(function(item, item_idx) { diff --git a/awx/ui/client/src/inventories-hosts/inventories/inventory.list.js b/awx/ui/client/src/inventories-hosts/inventories/inventory.list.js index abcb526d58..c821221d28 100644 --- a/awx/ui/client/src/inventories-hosts/inventories/inventory.list.js +++ b/awx/ui/client/src/inventories-hosts/inventories/inventory.list.js @@ -19,6 +19,7 @@ export default ['i18n', function(i18n) { basePath: 'inventory', title: false, disableRow: "{{ inventory.pending_deletion }}", + disableRowValue: 'pending_deletion', fields: { status: { diff --git a/awx/ui/client/src/shared/list-generator/list-generator.factory.js b/awx/ui/client/src/shared/list-generator/list-generator.factory.js index a1f7088769..8e6b240c87 100644 --- a/awx/ui/client/src/shared/list-generator/list-generator.factory.js +++ b/awx/ui/client/src/shared/list-generator/list-generator.factory.js @@ -290,6 +290,7 @@ export default ['$compile', 'Attr', 'Icon', // gotcha: transcluded elements require custom scope linking - binding to $parent models assumes a very rigid DOM hierarchy // see: lookup-modal.directive.js for example innerTable += options.mode === 'lookup' ? `
` : `"\n"`; + innerTable += "