diff --git a/awx/ui/client/features/users/tokens/users-tokens-add-application.route.js b/awx/ui/client/features/users/tokens/users-tokens-add-application.route.js index f647fc5edf..20173c260a 100644 --- a/awx/ui/client/features/users/tokens/users-tokens-add-application.route.js +++ b/awx/ui/client/features/users/tokens/users-tokens-add-application.route.js @@ -13,8 +13,7 @@ export default { } }, data: { - basePath: 'applications', - formChildState: true + basePath: 'applications' }, ncyBreadcrumb: { skip: true diff --git a/awx/ui/client/features/users/tokens/users-tokens-add.partial.html b/awx/ui/client/features/users/tokens/users-tokens-add.partial.html index f9055fd2e5..25bd01a21a 100644 --- a/awx/ui/client/features/users/tokens/users-tokens-add.partial.html +++ b/awx/ui/client/features/users/tokens/users-tokens-add.partial.html @@ -9,7 +9,7 @@ - + diff --git a/awx/ui/client/features/users/tokens/users-tokens-add.route.js b/awx/ui/client/features/users/tokens/users-tokens-add.route.js index 56effe1991..e8619b892c 100644 --- a/awx/ui/client/features/users/tokens/users-tokens-add.route.js +++ b/awx/ui/client/features/users/tokens/users-tokens-add.route.js @@ -30,7 +30,7 @@ export default { label: N_('CREATE TOKEN') }, views: { - 'preFormView@users.edit': { + 'preFormView@users': { templateUrl: addTemplate, controller: AddController, controllerAs: 'vm' diff --git a/awx/ui/client/src/shared/form-generator.js b/awx/ui/client/src/shared/form-generator.js index 5aeb590a81..734aafee4e 100644 --- a/awx/ui/client/src/shared/form-generator.js +++ b/awx/ui/client/src/shared/form-generator.js @@ -167,7 +167,6 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat wrapPanel(html, ignorePanel){ if(ignorePanel) { return ` -
${html}
@@ -176,7 +175,6 @@ angular.module('FormGenerator', [GeneratorHelpers.name, 'Utilities', listGenerat } else { return ` -
${MessageBar(this.form)}
${html} diff --git a/awx/ui/client/src/users/add/users-add.controller.js b/awx/ui/client/src/users/add/users-add.controller.js index c822b7bf9d..7cc98629ed 100644 --- a/awx/ui/client/src/users/add/users-add.controller.js +++ b/awx/ui/client/src/users/add/users-add.controller.js @@ -14,10 +14,10 @@ const user_type_options = [ export default ['$scope', '$rootScope', 'UserForm', 'GenerateForm', 'Rest', 'Alert', 'ProcessErrors', 'ReturnToCaller', 'GetBasePath', - 'Wait', 'CreateSelect2', '$state', '$location', 'i18n', + 'Wait', 'CreateSelect2', '$state', '$location', 'i18n', 'canAdd', function($scope, $rootScope, UserForm, GenerateForm, Rest, Alert, ProcessErrors, ReturnToCaller, GetBasePath, Wait, CreateSelect2, - $state, $location, i18n) { + $state, $location, i18n, canAdd) { var defaultUrl = GetBasePath('organizations'), form = UserForm; @@ -28,6 +28,7 @@ export default ['$scope', '$rootScope', 'UserForm', 'GenerateForm', 'Rest', // apply form definition's default field values GenerateForm.applyDefaults(form, $scope); + $scope.canAdd = canAdd; $scope.isAddForm = true; $scope.ldap_user = false; $scope.not_ldap_user = !$scope.ldap_user; diff --git a/awx/ui/client/src/users/edit/users-edit.controller.js b/awx/ui/client/src/users/edit/users-edit.controller.js index f2294a1703..f44c34b2a8 100644 --- a/awx/ui/client/src/users/edit/users-edit.controller.js +++ b/awx/ui/client/src/users/edit/users-edit.controller.js @@ -14,10 +14,10 @@ const user_type_options = [ export default ['$scope', '$rootScope', '$stateParams', 'UserForm', 'Rest', 'ProcessErrors', 'GetBasePath', 'Wait', 'CreateSelect2', - '$state', 'i18n', 'resolvedModels', + '$state', 'i18n', 'resolvedModels', 'resourceData', function($scope, $rootScope, $stateParams, UserForm, Rest, ProcessErrors, - GetBasePath, Wait, CreateSelect2, $state, i18n, models) { - + GetBasePath, Wait, CreateSelect2, $state, i18n, models, resourceData) { + for (var i = 0; i < user_type_options.length; i++) { user_type_options[i].label = i18n._(user_type_options[i].label); } @@ -26,7 +26,10 @@ export default ['$scope', '$rootScope', '$stateParams', 'UserForm', 'Rest', var form = UserForm, master = {}, id = $stateParams.user_id, - defaultUrl = GetBasePath('users') + id; + defaultUrl = GetBasePath('users') + id, + user_obj = resourceData.data; + + $scope.breadcrumb.user_name = user_obj.username; init(); @@ -40,49 +43,39 @@ export default ['$scope', '$rootScope', '$stateParams', 'UserForm', 'Rest', $scope.user_type = user_type_options[0]; $scope.$watch('user_type', user_type_sync($scope)); $scope.$watch('is_superuser', hidePermissionsTabSmartSearchAndPaginationIfSuperUser($scope)); - Rest.setUrl(defaultUrl); - Wait('start'); - Rest.get(defaultUrl).then(({data}) => { - $scope.user_id = id; - $scope.ldap_user = (data.ldap_dn !== null && data.ldap_dn !== undefined && data.ldap_dn !== '') ? true : false; - $scope.not_ldap_user = !$scope.ldap_user; - master.ldap_user = $scope.ldap_user; - $scope.socialAuthUser = (data.auth.length > 0) ? true : false; - $scope.external_account = data.external_account; + $scope.user_id = id; + $scope.ldap_user = (user_obj.ldap_dn !== null && user_obj.ldap_dn !== undefined && user_obj.ldap_dn !== '') ? true : false; + $scope.not_ldap_user = !$scope.ldap_user; + master.ldap_user = $scope.ldap_user; + $scope.socialAuthUser = (user_obj.auth.length > 0) ? true : false; + $scope.external_account = user_obj.external_account; - $scope.user_type = $scope.user_type_options[0]; - $scope.is_system_auditor = false; - $scope.is_superuser = false; - if (data.is_system_auditor) { - $scope.user_type = $scope.user_type_options[1]; - $scope.is_system_auditor = true; - } - if (data.is_superuser) { - $scope.user_type = $scope.user_type_options[2]; - $scope.is_superuser = true; - } + $scope.user_type = $scope.user_type_options[0]; + $scope.is_system_auditor = false; + $scope.is_superuser = false; + if (user_obj.is_system_auditor) { + $scope.user_type = $scope.user_type_options[1]; + $scope.is_system_auditor = true; + } + if (user_obj.is_superuser) { + $scope.user_type = $scope.user_type_options[2]; + $scope.is_superuser = true; + } - $scope.user_obj = data; - $scope.name = data.username; + $scope.user_obj = user_obj; + $scope.name = user_obj.username; - CreateSelect2({ - element: '#user_user_type', - multiple: false - }); + CreateSelect2({ + element: '#user_user_type', + multiple: false + }); - $scope.$watch('user_obj.summary_fields.user_capabilities.edit', function(val) { - $scope.canAdd = (val === false) ? false : true; - }); + $scope.$watch('user_obj.summary_fields.user_capabilities.edit', function(val) { + $scope.canAdd = (val === false) ? false : true; + }); - setScopeFields(data); - Wait('stop'); - }) - .catch(({data, status}) => { - ProcessErrors($scope, data, status, null, { - hdr: i18n._('Error!'), - msg: i18n.sprintf(i18n._('Failed to retrieve user: %s. GET status: '), $stateParams.id) + status - }); - }); + setScopeFields(user_obj); + } function user_type_sync($scope) { diff --git a/awx/ui/client/src/users/main.js b/awx/ui/client/src/users/main.js index 3701d4f626..64222e3977 100644 --- a/awx/ui/client/src/users/main.js +++ b/awx/ui/client/src/users/main.js @@ -10,12 +10,11 @@ import UsersEdit from './edit/users-edit.controller'; import UserForm from './users.form'; import UserList from './users.list'; +import userListRoute from './users.route'; import UserTokensListRoute from '../../features/users/tokens/users-tokens-list.route'; import UserTokensAddRoute from '../../features/users/tokens/users-tokens-add.route'; import UserTokensAddApplicationRoute from '../../features/users/tokens/users-tokens-add-application.route'; -import { N_ } from '../i18n'; - export default angular.module('Users', []) .controller('UsersList', UsersList) @@ -29,20 +28,52 @@ angular.module('Users', []) let stateExtender = $stateExtenderProvider.$get(); function generateStateTree() { - let userTree = stateDefinitions.generateTree({ - parent: 'users', - modes: ['add', 'edit'], - list: 'UserList', + let userAdd = stateDefinitions.generateTree({ + name: 'users.add', + url: '/add', + modes: ['add'], form: 'UserForm', controllers: { - list: UsersList, - add: UsersAdd, - edit: UsersEdit + add: 'UsersAdd' + }, + resolve: { + add: { + canAdd: ['rbacUiControlService', '$state', function(rbacUiControlService, $state) { + return rbacUiControlService.canAdd('users') + .then(function(res) { + return res.canAdd; + }) + .catch(function() { + $state.go('users'); + }); + }], + resolvedModels: ['MeModel', '$q', function(Me, $q) { + const promises= { + me: new Me('get').then((me) => me.extend('get', 'admin_of_organizations')) + }; + + return $q.all(promises); + }] + } + } + }); + + let userEdit = stateDefinitions.generateTree({ + name: 'users.edit', + url: '/:user_id', + modes: ['edit'], + form: 'UserForm', + parent: 'users', + controllers: { + edit: 'UsersEdit' }, data: { activityStream: true, activityStreamTarget: 'user' }, + breadcrumbs: { + edit: "{{breadcrumb.user_name}}" + }, resolve: { edit: { resolvedModels: ['MeModel', '$q', function(Me, $q) { @@ -50,31 +81,21 @@ angular.module('Users', []) me: new Me('get').then((me) => me.extend('get', 'admin_of_organizations')) }; - return $q.all(promises); - }] - }, - list: { - resolvedModels: ['MeModel', '$q', function(Me, $q) { - const promises= { - me: new Me('get') - }; - return $q.all(promises); }] } }, - ncyBreadcrumb: { - label: N_('USERS') - } }); - + return Promise.all([ - userTree + userAdd, + userEdit ]).then((generated) => { return { states: _.reduce(generated, (result, definition) => { return result.concat(definition.states); }, [ + stateExtender.buildDefinition(userListRoute), stateExtender.buildDefinition(UserTokensListRoute), stateExtender.buildDefinition(UserTokensAddRoute), stateExtender.buildDefinition(UserTokensAddApplicationRoute) diff --git a/awx/ui/client/src/users/users.partial.html b/awx/ui/client/src/users/users.partial.html new file mode 100644 index 0000000000..41b78528d4 --- /dev/null +++ b/awx/ui/client/src/users/users.partial.html @@ -0,0 +1,6 @@ +
+ +
+
+
+
diff --git a/awx/ui/client/src/users/users.route.js b/awx/ui/client/src/users/users.route.js new file mode 100644 index 0000000000..80f581a93b --- /dev/null +++ b/awx/ui/client/src/users/users.route.js @@ -0,0 +1,55 @@ +import {templateUrl} from '../shared/template-url/template-url.factory'; +import { N_ } from '../i18n'; + +export default { + name: 'users', + route: '/users', + ncyBreadcrumb: { + label: N_('USERS') + }, + data: { + activityStream: true, + activityStreamTarget: 'user' + }, + params: { + user_search: { + value: { + page_size: 20, + order_by: 'username' + } + } + }, + views: { + '@': { + templateUrl: templateUrl('users/users') + }, + 'list@users': { + templateProvider: function(UserList, generateList) { + let html = generateList.build({ + list: UserList, + mode: 'edit' + }); + html = generateList.wrapPanel(html); + return html; + }, + controller: 'UsersList' + } + }, + searchPrefix: 'user', + resolve: { + Dataset: ['UserList', 'QuerySet', '$stateParams', 'GetBasePath', + function(list, qs, $stateParams, GetBasePath) { + let path = GetBasePath(list.basePath) || GetBasePath(list.name); + return qs.search(path, $stateParams[`${list.iterator}_search`]); + } + ], + resolvedModels: ['MeModel', '$q', function(Me, $q) { + const promises= { + me: new Me('get') + }; + + return $q.all(promises); + }] + + } +};