diff --git a/awx/ui/client/src/controllers/Teams.js b/awx/ui/client/src/controllers/Teams.js index 280f40c4c1..e2be443712 100644 --- a/awx/ui/client/src/controllers/Teams.js +++ b/awx/ui/client/src/controllers/Teams.js @@ -199,7 +199,8 @@ export function TeamsEdit($scope, $rootScope, $location, generator = GenerateForm, form = TeamForm, id = $stateParams.team_id, - relatedSets = {}; + relatedSets = {}, + set; $scope.team_id = id; @@ -263,6 +264,12 @@ export function TeamsEdit($scope, $rootScope, $location, relatedSets: relatedSets }); + for (set in relatedSets) { + $scope.search(relatedSets[set].iterator); + } + + $scope.team_obj = data; + LookUpInit({ url: GetBasePath('organizations'), scope: $scope, @@ -298,6 +305,14 @@ export function TeamsEdit($scope, $rootScope, $location, init(); + $scope.convertApiUrl = function(str) { + if (str) { + return str.replace("api/v1", "#"); + } else { + return null; + } + }; + /* Related Set implementation TDB */ } diff --git a/awx/ui/client/src/controllers/Users.js b/awx/ui/client/src/controllers/Users.js index f0679cebf1..f6ac43d219 100644 --- a/awx/ui/client/src/controllers/Users.js +++ b/awx/ui/client/src/controllers/Users.js @@ -231,7 +231,8 @@ export function UsersEdit($scope, $rootScope, $location, form = UserForm, master = {}, id = $stateParams.user_id, - relatedSets = {}; + relatedSets = {}, + set; generator.inject(form, { mode: 'edit', related: true, scope: $scope }); generator.reset(); @@ -248,17 +249,25 @@ export function UsersEdit($scope, $rootScope, $location, return; }; + $scope.convertApiUrl = function(str) { + if (str) { + return str.replace("api/v1", "#"); + } else { + return null; + } + }; + var setScopeRelated = function(data, related){ _(related) - .pick(function(value, key){ - return data.related.hasOwnProperty(key) === true; - }) - .forEach(function(value, key){ - relatedSets[key] = { - url: data.related[key], - iterator: value.iterator - }; - }) + .pick(function(value, key){ + return data.related.hasOwnProperty(key) === true; + }) + .forEach(function(value, key){ + relatedSets[key] = { + url: data.related[key], + iterator: value.iterator + }; + }) .value(); }; // prepares a data payload for a PUT request to the API @@ -295,6 +304,11 @@ export function UsersEdit($scope, $rootScope, $location, scope: $scope, relatedSets: relatedSets }); + + for (set in relatedSets) { + $scope.search(relatedSets[set].iterator); + } + Wait('stop'); }) .error(function (data, status) { diff --git a/awx/ui/client/src/forms/Teams.js b/awx/ui/client/src/forms/Teams.js index 471cda62c4..9c9d3b6812 100644 --- a/awx/ui/client/src/forms/Teams.js +++ b/awx/ui/client/src/forms/Teams.js @@ -59,11 +59,10 @@ export default }, related: { - /* - permissions: { + access_list: { basePath: 'teams/:id/access_list/', type: 'collection', - title: 'Permissions', + title: 'Users', iterator: 'permission', index: false, open: false, @@ -76,148 +75,50 @@ export default actionClass: 'btn List-buttonSubmit', buttonContent: '+ ADD' } - } - }, - */ - - - credentials: { - type: 'collection', - title: 'Credentials', - iterator: 'credential', - open: false, - index: false, - - actions: { - add: { - ngClick: "add('credentials')", - label: 'Add', - add: 'Add a new credential', - actionClass: 'btn List-buttonSubmit', - buttonContent: '+ ADD' - } - }, - - fields: { - name: { - key: true, - label: 'Name' - }, - description: { - label: 'Description' - } - }, - - fieldActions: { - edit: { - label: 'Edit', - ngClick: "edit('credentials', credential.id, credential.name)", - icon: 'icon-edit', - awToolTip: 'Modify the credential', - 'class': 'btn btn-default' - }, - "delete": { - label: 'Delete', - ngClick: "delete('credentials', credential.id, credential.name, 'credential')", - icon: 'icon-trash', - "class": 'btn-danger', - awToolTip: 'Remove the credential' - } - } - }, - - projects: { - type: 'collection', - title: 'Projects', - iterator: 'project', - open: false, - index: false, - - actions: { - add: { - ngClick: "add('projects')", - label: 'Add', - actionClass: 'btn List-buttonSubmit', - buttonContent: '+ ADD' - } - }, - - fields: { - name: { - key: true, - label: 'Name' - }, - description: { - label: 'Description' - } - }, - - fieldActions: { - edit: { - label: 'Edit', - ngClick: "edit('projects', project.id, project.name)", - icon: 'icon-edit', - awToolTip: 'Modify the project', - 'class': 'btn btn-default' - }, - "delete": { - label: 'Delete', - ngClick: "delete('projects', project.id, project.name, 'project')", - icon: 'icon-trash', - "class": 'btn-danger', - awToolTip: 'Remove the project' - } - } - }, - - users: { - type: 'collection', - title: 'Users', - iterator: 'user', - open: false, - index: false, - - actions: { - add: { - ngClick: "add('users')", - label: 'Add', - awToolTip: 'Add a user', - actionClass: 'btn List-buttonSubmit', - buttonContent: '+ ADD' - } }, fields: { username: { key: true, - label: 'Username' + label: 'User', + linkBase: 'users', + class: 'col-lg-3 col-md-3 col-sm-3 col-xs-4' }, - first_name: { - label: 'First Name' - }, - last_name: { - label: 'Last Name' - } - }, - - fieldActions: { - edit: { - label: 'Edit', - ngClick: "edit('users', user.id, user.username)", - icon: 'icon-edit', - awToolTip: 'Edit user', - 'class': 'btn btn-default' - }, - "delete": { - label: 'Delete', - ngClick: "delete('users', user.id, user.username, 'user')", - icon: 'icon-terash', - "class": 'btn-danger', - awToolTip: 'Remove user' + role: { + label: 'Role', + type: 'role', + noSort: true, + class: 'col-lg-9 col-md-9 col-sm-9 col-xs-8' } } + }, + roles: { + type: 'collection', + title: 'Permissions', + iterator: 'role', + open: false, + index: false, + actions: {}, + + fields: { + name: { + label: 'Name', + ngBind: 'role.summary_fields.resource_name', + linkTo: '{{convertApiUrl(role.related[role.summary_fields.resource_type])}}', + noSort: true + }, + type: { + label: 'Type', + ngBind: 'role.summary_fields.resource_type_display_name', + noSort: true + }, + role: { + label: 'Role', + ngBind: 'role.name', + noSort: true + } + }, + hideOnSuperuser: true } - } - }); //InventoryForm diff --git a/awx/ui/client/src/forms/Users.js b/awx/ui/client/src/forms/Users.js index d1c2c2613f..d115ae3011 100644 --- a/awx/ui/client/src/forms/Users.js +++ b/awx/ui/client/src/forms/Users.js @@ -115,71 +115,6 @@ export default }, related: { - /* - permissions: { - basePath: 'teams/:id/access_list/', - type: 'collection', - title: 'Permissions', - iterator: 'permission', - index: false, - open: false, - searchType: 'select', - actions: { - add: { - ngClick: "addPermission", - label: 'Add', - awToolTip: 'Add a permission', - actionClass: 'btn List-buttonSubmit', - buttonContent: '+ ADD' - } - } - }, - */ - - credentials: { - type: 'collection', - title: 'Credentials', - iterator: 'credential', - open: false, - index: false, - - actions: { - add: { - ngClick: "add('credentials')", - label: 'Add', - awToolTip: 'Add a credential for this user', - actionClass: 'btn List-buttonSubmit', - buttonContent: '+ ADD' - } - }, - - fields: { - name: { - key: true, - label: 'Name' - }, - description: { - label: 'Description' - } - }, - - fieldActions: { - edit: { - label: 'Edit', - ngClick: "edit('credentials', credential.id, credential.name)", - icon: 'icon-edit', - awToolTip: 'Edit the credential', - 'class': 'btn btn-default' - }, - "delete": { - label: 'Delete', - ngClick: "delete('credentials', credential.id, credential.name, 'credential')", - icon: 'icon-trash', - "class": 'btn-danger', - awToolTip: 'Delete the credential' - } - } - }, organizations: { type: 'collection', title: 'Organizations', @@ -197,9 +132,9 @@ export default description: { label: 'Description' } - } + }, + hideOnSuperuser: true }, - teams: { type: 'collection', title: 'Teams', @@ -217,8 +152,38 @@ export default description: { label: 'Description' } - } + }, + hideOnSuperuser: true + }, + roles: { + hideSearchAndActions: true, + type: 'collection', + title: 'Permissions', + iterator: 'permission', + open: false, + index: false, + actions: {}, + + fields: { + name: { + label: 'Name', + ngBind: 'permission.summary_fields.resource_name', + linkTo: '{{convertApiUrl(permission.related[permission.summary_fields.resource_type])}}', + noSort: true + }, + type: { + label: 'Type', + ngBind: 'permission.summary_fields.resource_type_display_name', + noSort: true + }, + role: { + label: 'Role', + ngBind: 'permission.name', + noSort: true + } + }, + hideOnSuperuser: true } } - }); //UserForm + }); diff --git a/awx/ui/client/src/search/getSearchHtml.service.js b/awx/ui/client/src/search/getSearchHtml.service.js index b7da64f702..f64e5a12bf 100644 --- a/awx/ui/client/src/search/getSearchHtml.service.js +++ b/awx/ui/client/src/search/getSearchHtml.service.js @@ -16,6 +16,7 @@ export default ['GetBasePath', function(GetBasePath) { delete f[i].ngClass; delete f[i].ngClick; delete f[i].icon; + delete f[i].linkTo; return {[i]: f[i]}; }).reduce(function (acc, i) { var key = Object.keys(i); diff --git a/awx/ui/client/src/shared/form-generator.js b/awx/ui/client/src/shared/form-generator.js index d5d44b0be2..ade9b3d79e 100644 --- a/awx/ui/client/src/shared/form-generator.js +++ b/awx/ui/client/src/shared/form-generator.js @@ -1462,7 +1462,7 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat html += (options.mode === 'edit') ? this.form.editTitle : this.form.addTitle; if(this.form.name === "user"){ html+= "Admin"; + "ng-if=is_superuser>System Administrator"; } html += "\n"; html += "
"; @@ -1781,14 +1781,16 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat }); html += ` -
+
0 - )\"> + ${collection.iterator}_total_rows > 0)\" + ng-hide=\"is_superuser && ${collection.hideOnSuperuser}\" + > ${tagSearch}
@@ -1800,18 +1802,39 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat `; // Message for when a search returns no results. This should only get shown after a search is executed with no results. - html += "
\n"; - html += "
No records matched your search.
\n"; - html += "
\n"; + var hideOnSuperuser = (hideOnSuperuser === true) ? true : false; + html += ` +
+
+ No records matched your search. +
+
+ `; // Show the "no items" box when loading is done and the user isn't actively searching and there are no results html += "
PLEASE ADD ITEMS TO THIS LIST
"; + html += ` +
+ System Administrators have access to all ${collection.iterator}s +
+ `; + // Start the list - html += "
0)\">\n"; - html += "\n"; - html += "\n"; - html += "\n"; + html += ` +
0)) && + !(is_superuser && ${collection.hideOnSuperuser})\"> +
+ + + `; html += (collection.index === undefined || collection.index !== false) ? "\n" : ""; for (fld in collection.fields) { html += "
#\n"; + html += ` +
+ `; html += "
"; html += "
"; html += "
    \n";